<?php
require_once 'ShopExRequest.class.php';
require_once 'ShopExUser.class.php';
require_once 'ShopExTrade.class.php';
require_once 'ShopExItem.class.php';



//require_once 'TaoBaoLogistics.class.php';
//require_once 'TaoBaoProduct.class.php';
//require_once 'TaoBaoCatProp.class.php';
//require_once 'TaoBaoTradeRate.class.php';
//require_once 'TaoBaoShop.class.php';
//require_once 'TaoBaoIncrement.class.php';
//
//require_once 'TaoBaoWangWang.class.php';
//require_once 'TaoBaoShouFei.class.php';
//require_once 'TaoBaoFenXiao.class.php';
//require_once 'TaoBaoKe.class.php';



/**
 *ShopEx接口运行时发生错误时，抛出此异常. 
 */
class ShopExRuntimeExecption extends Exception
{
	function __construct($errorCode, $errorMessage)
	{
		$errorCode = intval ( $errorCode );
		if ($errorCode > 0)
			$errorMessage = "ShopEx运行失败[{$errorCode}]：" . self::get_shopex_error_msg ( $errorCode ) . ";\n" . $errorMessage;
		parent::__construct ( $errorMessage, $errorCode );
	}
	static function get_shopex_error_msg($errorCode)
	{
		if ($errorCode <= 0)
			return;
		include_once 'ShopExErrorMsg.inc.php';
		$arr = &get_shopex_error_msg_array ();
		return $arr [strval ( $errorCode )];
	}
}



/**
 * TaoBao接口运行时.
 */
class ShopExRuntime
{
	/**
	 * @var TaoBaoRequest $request 用于访问TaoBao接口.
	 */
	var $request;
	/**
	 * @var integer $maxTryCount 调用可重调用数据不变接口函数失败最大重试次数，默认3次
	 */
	var $maxTryCount = 3;
	/**
	 * @var integer $minTrySpanMicroseconds 调用可重调用数据不变接口函数失败最小重试时间间隔，毫秒数，默认300毫秒。
	 */
	var $minTrySpanMicroseconds = 300;
	/**
	 * @var integer $maxTrySpanMicroseconds 调用可重调用数据不变接口函数失败最大重试时间间隔，毫秒数，默认500毫秒。
	 */
	var $maxTrySpanMicroseconds = 500;
	
	/**
	 * 创建TaoBao接口API.
	 * @param array $taobao_token 操作用户的TabBao 令牌.
	 * <br/>必须包含以下参数：<br/>
	 * string app_key API应用的标志符.<br/>
	 * string app_secret API appSecret，用于用户鉴权.<br/>
	 * string app_session  淘宝会话
	 */
	function __construct($shopex_token)
	{
		if (! is_array ( $shopex_token ))
			throw new ShopExRuntimeExecption ( - 1, 'ShopExRuntime创建失败：参数类型错误' );
		
		$app_key = $shopex_token ['app_key'];
		$app_secret = $shopex_token ['app_secret'];
		$host_url=$shopex_token ['host_url'];
		
		if (! $app_key || ! $app_secret)
			throw new ShopExRuntimeExecption ( - 1, 'ShopExRuntime创建失败：参数错误' );
		
		$this->request = new ShopExRequest ();
		$this->request->_host_url=$host_url.$this->request->_end_url;
		$this->request->app_token = array ('app_key' => $app_key, 'app_secret' => $app_secret );
	
	}
	function __destruct()
	{
		$this->request = NULL;
	}
	/**
	 * 将数组 $params 的值导入到对象 $obj 中，主要用于本类函数的参数对象中，如TradesParam $tradesparam
	 * <br/>此函数仅用于简单对象，即不包含其它对象的复杂对象。仅导入数组存在的同名var
	 * @param array $params  源数组
	 * @param mixed $obj 目标对象
	 */
	static function put_object_vars(array &$params, $obj)
	{
		if (count ( $params ) == 0 || ! is_object ( $obj ))
			return;
		foreach ( $params as $key => $val )
			if (isset ( $val ) && property_exists ( $obj, $key ))
				$obj->$key = $val;
	}
	
	function setRunInSandBox($isRunInSandBox)
	{
		$this->request->isRunInSandBox = $isRunInSandBox;
	}
	
	/**
	 * 搜索当前会话用户作为卖家已卖出的交易数据，taobao method: taobao.trades.sold.get
	 * <br/>返回数据结果为创建订单时间的倒序
	 * @param TradesResult $tradesresult 传入填充要交易数据
	 * @param TradesParam $tradesparam 搜索参数
	 * @param string $fields 查询字段。如果为空，自动传入Trade的所有字段
	 * <br/>需要返回的字段。目前支持有：
	 * <br/>1、Trade中可以指定返回的fields：seller_nick, buyer_nick, title, type, created, 
	 * tid, seller_rate, buyer_rate, status, payment, discount_fee, adjust_fee, post_fee,
	 * total_fee, pay_time, end_time, modified, consign_time, buyer_obtain_point_fee,
	 * point_fee, real_point_fee, received_payment, commission_fee, pic_path, iid, num, 
	 * price, cod_fee, cod_status, shipping_type, receiver_name, receiver_state, receiver_city, 
	 * receiver_district, receiver_address, receiver_zip, receiver_mobile, 
	 * receiver_phone 
	 * <br/>2、Order中可以指定返回fields：orders.title, orders.pic_path, orders.price, orders.num, 
	 * orders.iid, orders.sku_id, orders.refund_status, orders.status, orders.oid, 
	 * orders.total_fee, orders.payment, orders.discount_fee, orders.adjust_fee, 
	 * orders.sku_properties_name, orders.item_meal_name, orders.buyer_rate, 
	 * orders.seller_rate, orders.outer_iid, orders.outer_sku_id, orders.refund_id, orders.seller_type
	 * <br/>3、fields：orders（返回Order的所有内容）
	 * @return TradesResult 返回已经填充的交易数据
	 */

	function readTradesSold(ShopExTradesResult $trade,ShopExTradesParam $tradesparam ,$fields = NULL)
	{
		
		if (! $trade)
			throw new ShopExRuntimeExecption ( - 1, 'getlist运行失败：参数错误' );
			
			$paramarr = get_object_vars ( $tradesparam );
		if (! $fields)
		{
			$fields = &$this->_getFields ( $trade );
		}
		$paramarr ['fields'] = $fields;
	
		$resultarr = &$this->__fireRequest ( 'order.getlist', $paramarr );
	//	print_r($resultarr);exit;
		return $this->__firefillProperty ( $trade, $resultarr, ShopExTradesResult::$_DataLayerout ['varclass'] );
	}
	/**
	 * 搜索当前会话用户作为卖家已卖出的增量交易数据，taobao method: taobao.trades.sold.increment.get
	 * <br/>只能查询时间跨度为一天的增量交易记录 
	 * <br/>返回数据结果为创建订单时间的倒序
	 * @param TradesResult $tradesresult 传入要填充的增量交易数据
	 * @param TradesParam $tradesparam 搜索参数
	 * @param string $fields 查询字段。如果为空，自动传入Trade的所有字段
	 * <br/>需要返回的字段，目前支持字段见@see readTradesSold.
	 * @return TradesResult 返回已经填充的增量交易数据
	 */
	function readTradesSoldIncrement(TradesResult $tradesresult, TradesIncrementParam $tradesparam, $fields = NULL)
	{
		if (! $tradesparam || ! $tradesresult)
			throw new ShopExRuntimeExecption ( - 1, 'readTradesSoldIncrement运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $tradesparam );
		if (! $fields)
			$fields = &$this->_getFields ( new Trade () );
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.trades.sold.increment.get', $paramarr );
		return $this->__firefillProperty ( $tradesresult, $resultarr, TradesResult::$_DataLayerout ['varclass'] );
	}
	
	/**
	 * 获取单笔交易的部分信息(性能高)，taobao method: taobao.trade.get
	 * <br/>获取到的详细信息中不包含姓名，邮件，电话或手机，和支付宝账号信息
	 * <br/>获取到的Order中的payment字段在单笔子订单时包含物流费用，多笔子订单时不包含物流费用
	 * <br/>taobao.trade.get取到单笔交易的详细信息中无法取到如:email，姓名，电话或手机，和支付宝ID? 
	 * <br/>B商家通过taobao.trade.fullinfo.get这个API获取交易的收货人信息,C卖家无法获取收货人信息,
	 * 建议在淘宝店铺中从已卖出的宝贝批量导出订单获得收货人姓名等 。
	 * @param Trade $trade 搜索到的交易信息，返回的Trade和Order中包含的具体信息为入参fields请求的字段信息
	 * @param string $tid 交易编号 
	 * @param string $fields 查询字段。如果为空，自动传入Trade的所有字段
	 * <br/>需要返回的字段，目前支持字段见@see readTradesSold.
	 * @return Trade 返回搜索到的交易信息
	 */
	function readTrade(ShopExTradesResult $trade, $order_id, $fields = NULL)
	{
		
		if (! $trade || ! $order_id)
			throw new ShopExRuntimeExecption ( - 1, 'readTrade运行失败：参数错误' );
		
		$paramarr = array ('order_id' => $order_id );
		if (! $fields)
			$fields = &$this->_getFields ( $trade );
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'order.getlist', $paramarr );
		
		return $this->__firefillProperty ( $trade, $resultarr, ShopExTradesResult::$_DataLayerout ['varclass'] );
	}
	/**
	 * 获取单笔交易的详细信息，taobao method: taobao.trade.fullinfo.get
	 * <br/>只有在交易成功的状态下才能取到交易佣金，其它状态下取到的都是零或空值
	 * <br/>返回参数中的trade_memo和is_3d为专用字段，一般情况下查询不到
	 * <br/>只有单笔订单的情况下Trade数据结构中才包含商品相关的信息 
	 * <br/>获取到的Order中的payment字段在单笔子订单时包含物流费用，多笔子订单时不包含物流费用
	 * <br/>怎样取买家的信息?用taobao.trade.fullinfo.get查询订单详细信息。会带有买家的信息。
	 * <br/>订单中取不到outer_iid怎么办? 订单中如果取不到outer_iid但一定会取到iid，用iid去查询商品取到outer_iid。
	 * @param Trade $trade 搜索到的交易详细信息，返回的Trade和Order中包含的具体信息为入参fields请求的字段信息
	 * @param string $tid 交易编号 
	 * @param string $fields 查询字段。如果为空，自动传入Trade的所有字段
	 * <br/>需要返回的字段，目前支持字段见@see readTradesSold.
	 * @return Trade 返回搜索到的交易详细信息
	 */
	function readTradeFullinfo(ShopExTrade $trade, $order_id, $fields = NULL)
	{
		
		if (! $trade || ! $order_id)
			throw new ShopExRuntimeExecption ( - 1, 'readTradeFullinfo运行失败：参数错误' );
			
		//	$paramarr = array ('order_id' => $order_id );
		$paramarr = array ('order_id' => $order_id );
		if (! $fields)
			$fields = &$this->_getFields ( $trade );
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'order.getfullinfo', $paramarr );
		
		return $this->__firefillProperty ( $trade, $resultarr, ShopExTrade::$_DataLayerout ['varclass'] );
	}
	/**
	 * 获取交易确认收货费用，taobao method: taobao.trade.confirmfee.get
	 * @param TaobaoTradeConfirmFee $result 交易确认收货费用
	 * @param string $tid 交易编号，或子订单编号
	 * @param string $is_detail 是否是子订单。可选值:IS_FATHER(父订单),IS_CHILD(子订单) 
	 * @return TaobaoTradeConfirmFee 返回获取到的交易确认收货费用
	 */
	function readTradeConfirmfee(TaobaoTradeConfirmFee $result, $tid, $is_detail = 'IS_FATHER')
	{
		if (! $result || ! $tid)
			throw new ShopExRuntimeExecption ( - 1, 'readTradeConfirmfee运行失败：参数错误' );
		
		$paramarr = array ('tid' => $tid, 'is_detail' => $is_detail );
		//if(! $fields) $fields=&$this->_getFields($result);
		//$paramarr['fields']=$fields;
		

		$resultarr = &$this->__fireRequest ( 'taobao.trade.confirmfee.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 交易快照查询，taobao method: taobao.trade.snapshot.get
	 * <br/>取到交易的快照信息,共nbs调用
	 * @param Trade $result  搜索到的交易信息，
	 * 只包含Trade中的tid和snapshot、子订单Order中的oid和snapshot
	 * @param integer $tid    交易编号 
	 * @param string $fields 需要返回的字段列表。现只支持："snapshot"字段
	 * @return Trade 返回搜索到的交易信息
	 */
	function readTradeSnapshot(Trade $result, $tid, $fields = NULL)
	{
		if (! $result || ! $tid)
			throw new ShopExRuntimeExecption ( - 1, 'readTradeSnapshot运行失败：参数错误' );
		
		$paramarr = array ('tid' => $tid );
		$paramarr ['fields'] = 'snapshot';
		$resultarr = &$this->__fireRequest ( 'taobao.trade.snapshot.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, Trade::$_DataLayerout ['varclass'] );
	}
	/**
	 * 卖家关闭一笔交易，taobao method: taobao.trade.close
	 * <br/>只能关闭非关闭状态下的交易，其它情况下会报错
	 * <br/>关闭一笔交易（当前会话用户作为卖家达成的交易记录）
	 * @param integer $tid 交易编号 
	 * @param string $close_reason 交易关闭原因。最小长度: 6个字节
	 * @return string 关闭交易时间。格式:yyyy-MM-dd HH:mm:ss
	 */
	function writeTradeClose($tid, $close_reason)
	{
		if (! $close_reason || ! $tid)
			throw new ShopExRuntimeExecption ( - 1, 'writeTradeClose运行失败：参数错误' );
		if (strlen ( $close_reason ) < 6)
			throw new ShopExRuntimeExecption ( - 1, 'writeTradeClose运行失败： 交易关闭原因 (close_reason)必须大于6个字节' );
		
		$paramarr = array ('tid' => $tid, 'close_reason' => $close_reason );
		$resultarr = &$this->__fireRequest ( 'taobao.trade.close', $paramarr );
		$result = new stdClass ();
		$this->__firefillProperty ( $result, $resultarr );
		if ($result->tid != $tid)
			throw new ShopExRuntimeExecption ( - 2, 'writeTradeClose运行失败：运行结果tid不对' );
		return $result->modified;
	}
	/**
	 * 对一笔交易添加备注，taobao method: taobao.trade.memo.add
	 * <br/>此接口不可重调用，建议调用@see writeTradeMemoUpdate
	 * <br/>需要商家或以上权限才可调用此接口
	 * <br/>不能重复调用此接口添加备注，需要更新备注请用taobao.trade.memo.update
	 * @param integer $tid 交易编号 
	 * @param string $memo  交易备注。最大长度: 1000个字节，如果>1000，将截断为1000字节
	 * @return string 备注添加时间。格式:yyyy-MM-dd HH:mm:ss 
	 */
	function writeTradeMemoAdd($tid, $memo)
	{
		if (! $memo || ! $tid)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeTradeMemoAdd运行失败：参数错误' );
		if (strlen ( $memo ) > 1000)
			$memo = substr ( $memo, 0, 1000 );
		
		$paramarr = array ('tid' => $tid, 'memo' => $memo );
		$resultarr = &$this->__fireRequest ( 'taobao.trade.memo.add', $paramarr, false );
		$result = new stdClass ();
		$this->__firefillProperty ( $result, $resultarr );
		if ($result->tid != $tid)
			throw new TaoBaoRuntimeExecption ( - 2, 'writeTradeMemoAdd运行失败：运行结果tid不对' );
		return $result->created;
	}
	/**
	 * 修改一笔交易备注，taobao method: taobao.trade.memo.update
	 * <br/>需要商家或以上权限才可调用此接口
	 * <br/>可重复调用本接口更新交易备注
	 * <br/>本接口同时具有添加备注的功能
	 * @param integer $tid 交易编号 
	 * @param string $memo  交易备注。最大长度: 1000个字节，如果>1000，将截断为1000字节
	 * @return string 备注添加时间。格式:yyyy-MM-dd HH:mm:ss 
	 */
	function writeTradeMemoUpdate($tid, $memo)
	{
		if (! $memo || ! $tid)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeTradeMemoUpdate运行失败：参数错误' );
		if (strlen ( $memo ) > 1000)
			$memo = substr ( $memo, 0, 1000 );
		
		$paramarr = array ('tid' => $tid, 'memo' => $memo );
		$resultarr = &$this->__fireRequest ( 'taobao.trade.memo.update', $paramarr );
		$result = new stdClass ();
		$this->__firefillProperty ( $result, $resultarr );
		if ($result->tid != $tid)
			throw new TaoBaoRuntimeExecption ( - 2, 'writeTradeMemoUpdate运行失败：运行结果tid不对' );
		return $result->modified;
	}
	/**
	 * 更新交易订单的销售属性，taobao method: taobao.trade.ordersku.update
	 * @param number $oid  子订单编号（对于单笔订单的交易可以传交易编号）。
	 * @param number $sku_id  销售属性编号，可以通过taobao.item.skus.get获取订单对应的商品的所有销售属性。
	 * @param string $sku_props 销售属性组合串，格式：p1:v1;p2:v2，如：1627207:28329;20509:28314。
	 * 可以通过taobao.item.skus.get获取订单对应的商品的所有销售属性。
	 * @return Trade 只返回oid和modified
	 */
	function writeTradeOrderskuUpdate($oid, $sku_id, $sku_props)
	{
		if (! $sku_id || ! $oid || ! $sku_props)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeTradeOrderskuUpdate运行失败：参数错误' );
		
		$paramarr = array ('oid' => $oid, 'sku_id' => $sku_id, 'sku_props' => $sku_props );
		$resultarr = &$this->__fireRequest ( 'taobao.trade.ordersku.update', $paramarr );
		$result = new Trade ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 更改交易的收货地址，taobao method: taobao.trade.shippingaddress.update
	 * @param number $tid  子订单编号（对于单笔订单的交易可以传交易编号）。
	 * @param number $sku_id  销售属性编号，可以通过taobao.item.skus.get获取订单对应的商品的所有销售属性。
	 * @param string $sku_props 销售属性组合串，格式：p1:v1;p2:v2，如：1627207:28329;20509:28314。
	 * 可以通过taobao.item.skus.get获取订单对应的商品的所有销售属性。
	 * @return Trade 返回tid和modified
	 */
	function writeTradeShippingaddressUpdate($tid, TaobaoTradeReceiver $receiver)
	{
		if (! $tid || ! $receiver)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeTradeShippingaddressUpdate运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $receiver );
		$paramarr ['tid'] = $tid;
		$resultarr = &$this->__fireRequest ( 'taobao.trade.shippingaddress.update', $paramarr );
		$result = new Trade ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 单笔退款详情，taobao method: taobao.refund.get
	 * @param TaobaoRefund $result 搜索到的交易详细信息
	 * @param integer $refund_id 交易编号 
	 * @param string $fields 查询字段。如果为空，自动传入TaobaoRefund的所有字段
	 * <br/>需要返回的字段，目前支持字段见@see TaobaoRefund.
	 * @return TaobaoRefund 返回单笔退款详情 $result
	 */
	function readRefund(TaobaoRefund $result, $refund_id, $fields = NULL)
	{
		if (! $result || ! $refund_id)
			throw new TaoBaoRuntimeExecption ( - 1, 'readRefund运行失败：参数错误' );
		
		$paramarr = array ('refund_id' => $refund_id );
		if (! $fields)
			$fields = &$this->_getFields ( $result );
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.refund.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaoRefund::$_DataLayerout ['varclass'] );
	}
	/**
	 * 创建退款留言/凭证，taobao method: taobao.refund.message.add
	 * @param  integer $fund_id 退款编号
	 * @param  string  $content 留言内容。最大长度: 400个字节
	 * @param  string  $picpath 图片（凭证）。类型: JPG,GIF,PNG;最大为: 500K
	 * @return array   返回结果，数组结构如下 <br/>id：留言凭证编号；
	 * <br/>created：记录创建时间。格式:yyyy-MM-dd HH:mm:ss
	 */
	function writeRefundMessageAdd($fund_id, $content, $picpath = NULL)
	{
		if (! $fund_id || ! $content)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeRefundMessageAdd运行失败：参数错误' );
		if (! file_exists ( $picpath ))
			throw new TaoBaoRuntimeExecption ( - 1, 'writeRefundMessageAdd运行失败：找不到图片文件' . $picpath );
		
		$request = clone $this->request;
		$request->httpmethod = TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
		$request->postWithFiles ['image'] = $picpath;
		$paramarr = array ('fund_id' => $fund_id, 'content' => $content );
		$resultarr = &$this->__fireRequest ( 'taobao.refund.message.add', $paramarr, true, $request );
		$request = NULL;
		
		$list = new stdClass ();
		$this->__firefillProperty ( $list, $resultarr );
		return get_object_vars ( $list );
	}
	/**
	 * 退款留言/凭证列表查询，taobao method: taobao.refund.messages.get
	 * @param TaobaoRefundMessageList $result 搜索到的交易详细信息
	 * @param integer $refund_id 交易编号 
	 * @param integer $page_no 页码。取值范围:大于零的整数; 默认值:1
	 * @param integer $page_size 每页条数。取值范围:大于零的整数; 默认值:40;最大值:200
	 * @param string $fields 查询字段。如果为空，自动传入TaobaoRefundMessage的所有字段
	 * <br/>需要返回的字段，目前支持字段见@see TaobaoRefundMessage.
	 * @return TaobaoRefundMessageList 返回单笔退款详情 $result
	 */
	function readRefundMessages(TaobaoRefundMessageList $result, $refund_id, $page_no = 1, $page_size = 40, $fields = NULL)
	{
		if (! $result || ! $refund_id || $page_no < 1 || $page_size < 1)
			throw new TaoBaoRuntimeExecption ( - 1, 'readRefundMessages运行失败：参数错误' );
		$paramarr = array ('refund_id' => $refund_id, 'page_no' => $page_no, 'page_size' => $page_size );
		if (! $fields)
			$fields = &$this->_getFields ( new TaobaoRefundMessage () );
		$paramarr ['fields'] = $fields;
		$resultarr = &$this->__fireRequest ( 'taobao.refund.messages.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaoRefundMessageList::$_DataLayerout ['varclass'] );
	}
	/**
	 * 查询卖家收到的退款列表，taobao method: taobao.refunds.receive.get 
	 * @param TaobaoRefundList $result 要搜索退款信息列表
	 * @param TaobaoRefundListParam $param 查询参数
	 * @param string $fields 查询字段。如果为空，自动传入TaobaoRefund的所有字段
	 * <br/>需要返回的字段，目前支持字段见refund_id, tid, title, buyer_nick, seller_nick, total_fee, status, created, refund_fee, oid, good_status, company_name, sid, payment, reason, desc, has_good_return, modified, order_status.
	 * @return TaobaoRefundList 返回退款信息列表 $result
	 */
	function readRefundsReceive(ShopExRefundList $result,  $fields = NULL)
	{
		if (! $result )
			throw new ShopExRuntimeExecption ( - 1, 'readRefundsReceive运行失败：参数错误' );
		$paramarr['searchParam']=null;
		
		if (! $fields)
			$fields = &$this->_getFields ( $result );
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'order.refundlist', $paramarr );
		
		
		return $this->__firefillProperty ( $result, $resultarr, ShopExRefundList::$_DataLayerout ['varclass'] );
	}
	/**
	 * 查询买家申请的退款列表，taobao method: taobao.refunds.apply.get
	 * @param TaobaoRefundList $result 要搜索退款信息列表
	 * @param TaobaoRefundListApplyParam $param 查询参数
	 * @param string $fields 查询字段。如果为空，自动传入所有字段
	 * <br/>需要返回的字段，目前支持字段见refund_id, tid, title, buyer_nick, seller_nick, total_fee, status, created, refund_fee.
	 * @return TaobaoRefundList 返回退款信息列表 $result
	 */
	function readRefundsApply(TaobaoRefundList $result, TaobaoRefundListApplyParam $param, $fields = NULL)
	{
		if (! $result || ! $param)
			throw new TaoBaoRuntimeExecption ( - 1, 'readRefundsApply运行失败：参数错误' );
		$paramarr = get_object_vars ( $param );
		if (! $fields)
			$fields = 'refund_id, tid, title, buyer_nick, seller_nick, total_fee, status, created, refund_fee';
		$paramarr ['fields'] = $fields;
		$resultarr = &$this->__fireRequest ( 'taobao.refunds.apply.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaoRefundList::$_DataLayerout ['varclass'] );
	}
	/**
	 * 发货处理 ，taobao method: taobao.delivery.send
	 * <br/>对买家已付款状态的交易进行发货操作
	 * <br/>调用发货API成功，再次调用还是会返回成功，更换了参数信息还是会返回成功? 
	 * 如果调用发货API发货成功后。如果还对已经发货的交易id来进行发货的话，会一直返回成功信息。
	 * 即便是更换了参数信息也不会修改之前发货的记录
	 * @param DeliverySendParam $param 发货处理参数，类型@see DeliverySendParam
	 * @return boolean 成功 true
	 */
	function writeDeliverySend($order_id,$out_sid)
	{
		if (! $order_id)
			throw new ShopExRuntimeExecption ( - 1, 'writeDeliverySend运行失败：参数错误' );
	
		$paramarr['order_id']=$order_id;
		$paramarr['out_sid']=$out_sid;

		$resultarr = $this->__fireRequest ( 'order.deliverySend', $paramarr );
		return $resultarr['is_success'];

	}
	/**
	 * 货到付款(cod)发货处理 ，taobao method: taobao.delivery.cod.send
	 * @param TaobaoDeliveryCodSendParam $param 发货处理参数
	 * @return boolean 成功 true
	 */
	function writeDeliveryCodSend(TaobaoDeliveryCodSendParam $param)
	{
		if (! $param)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeDeliverySend运行失败：参数错误' );
		$param->order_type = 'cod';
		$paramarr = get_object_vars ( $param );
		$resultarr = &$this->__fireRequest ( 'taobao.delivery.cod.send', $paramarr );
		$result = new stdClass ();
		$this->__firefillProperty ( $result, $resultarr );
		return $result->is_success;
	}
	/**
	 * 查询地址区域 ，taobao method: taobao.areas.get
	 * <br/>查询标准地址区域代码信息 
	 * 参考：http://www.stats.gov.cn/tjbz/xzqhdm/t20080215_402462675.htm.
	 * @param array $areas   要填充地址区域，类型@see Area
	 * @param string $fields 查询字段。如果为空，自动传入Area的所有字段
	 * @return array 已经填充的地址区域，类型@see Area
	 */
	function &readAreas(array &$areas, $fields = NULL)
	{
		if (! $fields)
			$fields = &$this->_getFields ( new Area () );
		$paramarr ['fields'] = $fields;
		$resultarr = &$this->__fireRequest ( 'taobao.areas.get', $paramarr );
		$list = new _AreaList ();
		$this->__firefillProperty ( $list, $resultarr, _AreaList::$_DataLayerout ['varclass'] );
		$areas = $list->areas;
		return $areas;
	}
	/**
	 * 查询物流公司信息 ，taobao method: taobao.logistics.companies.get
	 * <br/>查询用于发货的物流公司信息
	 * @param array $companies   要填充物流公司信息，类型@see LogisticCompany
	 * @param boolean $is_recommended 是否查询推荐物流公司，可选值:true,false，
	 * 如果不提供此参数,将会返回所有支持电话联系的物流公司 
	 * @param string $order_mode 推荐物流公司的下单方式。
	 * <br/>可选值:offline(电话联系/自己联系),online(在线下单),all(即电话联系又在线下单)，
	 * <br/>此参数仅仅用于is_recommended 为ture时，就是说对于推荐物流公司才可用，
	 * 如果不选择此参数将会返回推荐物流中支持电话联系的物流公司。
	 * @param string $fields 查询字段。如果为空，自动传入LogisticCompany的所有字段
	 * @return array 已经填充的物流公司信息，返回的包含的具体信息为入参fields请求的字段信息，类型@see LogisticCompany
	 */
	function &readLogisticsCompanies(array &$result, $is_recommended = NULL, $order_mode = NULL, $fields = NULL)
	{
		if (! isset ( $result ))
			throw new TaoBaoRuntimeExecption ( - 1, 'readLogisticsCompanies运行失败：参数错误' );
		$paramarr = array ('is_recommended' => $is_recommended, 'order_mode' => $order_mode );
		if (! $fields)
			$fields = &$this->_getFields ( new LogisticCompany () );
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.logistics.companies.get', $paramarr );
		
		$list = new _LogisticCompanyList ();
		$this->__firefillProperty ( $list, $resultarr, _LogisticCompanyList::$_DataLayerout ['varclass'] );
		$result = $list->logistics_companies;
		return $result;
	}
	/**
	 * 批量查询物流订单 ，taobao method: taobao.logistics.orders.get
	 * @param ShippingResult $result   要填充物流订单结果
	 * @param string $fields 查询字段。如果为空，自动传入Shipping的所有字段
	 * @return array 已经填充物流订单结果，类型@see ShippingResult
	 */
	function readLogisticsOrders(ShippingResult $result, ShippingParam $param, $fields = NULL)
	{
		if (! $param || ! $result)
			throw new TaoBaoRuntimeExecption ( - 1, 'readLogisticsOrdersDetail运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		if (! $fields)
		{
			$fields = &$this->_getFields ( new Shipping () );
			$fields .= ',receiver_location'; //taobao bug,param[receiver_location]->result[location] 
		}
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.logistics.orders.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, ShippingResult::$_DataLayerout ['varclass'] );
	}
	/**
	 * 批量查询物流订单,返回详细信息 ，taobao method: taobao.logistics.orders.detail.get
	 * @param ShippingResult $result   要填充物流订单结果
	 * @param ShippingParam $param   批量查询物流订单条件参数
	 * @param string $fields 查询字段。如果为空，自动传入Shipping的所有字段
	 * @return array 已经填充物流订单结果，类型@see ShippingResult
	 */
	function readLogisticsOrdersDetail(ShippingResult $result, ShippingParam $param, $fields = NULL)
	{
		if (! $param || ! $result)
			throw new TaoBaoRuntimeExecption ( - 1, 'readLogisticsOrdersDetail运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		if (! $fields)
		{
			$fields = &$this->_getFields ( new Shipping () );
			$fields .= ',receiver_location'; //taobao bug,param[receiver_location]->result[location] 
		}
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.logistics.orders.detail.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, ShippingResult::$_DataLayerout ['varclass'] );
	}
	/**
	 * 查询partners物流公司信息，taobao method: taobao.logistics.partners.get 
	 * @param array $result   要填充物流公司信息，类型@see TaobaoLogisticsPartner
	 * @param string $service_type 服务类型，根据此参数可查出提供相应服务类型的物流公司信息(物流公司状态正常)，
	 * <br/>可选值：cod(货到付款)、online(在线下单)、 offline(自己联系)、limit(限时物流)。
	 * <br/>然后再根据source_id,target_id,goods_value这三个条件来过滤物流公司. 
	 * 目前输入自己联系服务类型将会返回空，因为自己联系并没有具体的服务信息，所以不会有记录。，
	 * @param string $source_id 物流公司揽货地地区码.
	 * 参考:http://www.stats.gov.cn/tjbz/xzqhdm/t20080215_402462675.htm  或者调用 taobao.areas.get 获取
	 * @param string $target_id 物流公司派送地地区码.
	 * 参考:http://www.stats.gov.cn/tjbz/xzqhdm/t20080215_402462675.htm 或者调用 taobao.areas.get 获取
	 * @param string $goods_value 货物价格.只有当选择货到付款此参数才会有效
	 * @param string $fields 查询字段。如果为空，自动传入TaobaoLogisticsPartner的所有字段
	 * @return array 已经填充的物流公司信息，类型@see TaobaoLogisticsPartner
	 */
	function &readLogisticsPartners(array &$result, $service_type, $source_id = NULL, $target_id = NULL, $goods_value = NULL, $fields = NULL)
	{
		if (! isset ( $result ) || ! $service_type)
			throw new TaoBaoRuntimeExecption ( - 1, 'readItemsAll运行失败：参数错误' );
		$paramarr = array ('service_type' => $service_type, 'source_id' => $source_id, 'target_id' => $target_id, 'goods_value' => $goods_value );
		if (! $fields)
			$fields = &$this->_getFields ( new TaobaoLogisticsPartner () );
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.logistics.partners.get', $paramarr );
		
		$list = new _TaobaoLogisticsPartnerList ();
		$this->__firefillProperty ( $list, $resultarr, _TaobaoLogisticsPartnerList::$_DataLayerout ['varclass'] );
		$result = array ();
		for($i = 0; $i < count ( $list->logistics_partners ); $i ++)
		{ //handle addition data
			$result [] = $list->logistics_partners [$i]->partner;
		}
		return $result;
	}
	
	/**
	 * 获取当前会话用户的所有商品列表 ，taobao method: taobao.items.all.get
	 * <br/>获取当前用户作为卖家的所有商品的列表，并能根据传入的条件对商品列表进行过滤
	 * <br/>只能获得商品的部分信息，商品的详细信息请通过taobao.item.get获取
	 * @param ItemGetListResult $result   要填充商品列表结果
	 * @param ItemGetListParam $param      获取商品列表条件参数
	 * @param string $fields 需返回的字段列表。
	 * 可选值：Item商品结构体中的以下字段：approve_status,iid,num_iid,title,nick,
	 * type,cid,pic_url,num,props,valid_thru,list_time,price,has_discount,
	 * has_invoice,has_warranty,has_showcase,modified,delist_time,postage_id,
	 * seller_cids,outer_id；字段之间用“,”分隔。
	 * <br/>不支持其他字段，如果需要获取其他字段数据，调用taobao.item.get。
	 * <br/>如果为空，自动返回所有支持的字段
	 * @return ItemGetListResult 已经填充商品列表结果，类型@see ItemGetListResult
	 */
	function readItemsAll(ShopExItemSearchResultList $result, ShopExItemSearchParam $param, $fields = NULL)
	{
		if (! $param || ! $result)
			throw new TaoBaoRuntimeExecption ( - 1, 'readItemsAll运行失败：参数错误' );
		
		$paramarr['searchParam'] =json_encode(get_object_vars ( $param ));

		
		if (! $fields)
		{
			$fields = &$this->_getFields ( $result );
		}
		$paramarr ['fields'] = $fields;
		

		$resultarr = &$this->__fireRequest ( 'good.getlist', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, ShopExItemSearchResultList::$_DataLayerout ['varclass'] );
	}
	/**
	 * 获取当前会话用户出售中的商品列表 ，taobao method: taobao.items.onsale.get
	 * <br/>获取当前用户作为卖家的出售中的商品列表， 并能根据传入的搜索条件对出售中的
	 * 商品列表进行过滤 <br/>只能获得商品的部分信息，商品的详细信息请通过taobao.item.get获取
	 * @param ItemGetListResult $result   要填充商品列表结果
	 * @param ItemGetListOnsaleParam $param      获取商品列表条件参数
	 * @param string $fields 需返回的字段列表。
	 * 可选值：Item商品结构体中的以下字段：approve_status,iid,num_iid,title,nick,
	 * type,cid,pic_url,num,props,valid_thru,list_time,price,has_discount,
	 * has_invoice,has_warranty,has_showcase,modified,delist_time,postage_id,
	 * seller_cids,outer_id；字段之间用“,”分隔。
	 * <br/>不支持其他字段，如果需要获取其他字段数据，调用taobao.item.get。
	 * <br/>如果为空，自动返回所有支持的字段
	 * @return ItemGetListResult 已经填充商品列表结果，类型@see ItemGetListResult
	 */
	function readItemsOnsale(ItemGetListResult $result, ItemGetListOnsaleParam $param, $fields = NULL)
	{
		if (! $param || ! $result)
			throw new TaoBaoRuntimeExecption ( - 1, 'readItemsAll运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		if (! $fields)
		{
			$fields = 'approve_status,iid,num_iid,title,nick,type,cid,pic_url,num,props,
           valid_thru,wlist_time,price,has_discount,has_invoice,has_warranty,
           has_showcase,modified,delist_time,postage_id,seller_cids,outer_id';
		}
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.items.onsale.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, ItemGetListResult::$_DataLayerout ['varclass'] );
	}
	/**
	 * 得到当前会话用户库存中的商品列表 ，taobao method: taobao.items.inventory.get
	 * <br/>获取当前用户作为卖家的仓库中的商品列表，并能根据传入的搜索条件
	 * 对仓库中的商品列表进行过滤 <br/>只能获得商品的部分信息，商品的详细信息请通过taobao.item.get获取
	 * @param ItemGetListResult $result   要填充商品列表结果
	 * @param ItemGetListInventoryParam $param      获取商品列表条件参数
	 * @param string $fields 需返回的字段列表。
	 * 可选值：Item商品结构体中的以下字段：approve_status,iid,num_iid,title,nick,
	 * type,cid,pic_url,num,props,valid_thru,list_time,price,has_discount,
	 * has_invoice,has_warranty,has_showcase,modified,delist_time,postage_id,
	 * seller_cids,outer_id；字段之间用“,”分隔。
	 * <br/>不支持其他字段，如果需要获取其他字段数据，调用taobao.item.get。
	 * <br/>如果为空，自动返回所有支持的字段
	 * @return ItemGetListResult 已经填充商品列表结果，类型@see ItemGetListResult
	 */
	function readItemsInventory(ItemGetListResult $result, ItemGetListInventoryParam $param, $fields = NULL)
	{
		if (! $param || ! $result)
			throw new TaoBaoRuntimeExecption ( - 1, 'readItemsAll运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		if (! $fields)
		{
			$fields = 'approve_status,iid,num_iid,title,nick,type,cid,pic_url,num,props,
           valid_thru,wlist_time,price,has_discount,has_invoice,has_warranty,
           has_showcase,modified,delist_time,postage_id,seller_cids,outer_id';
		}
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.items.inventory.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, ItemGetListResult::$_DataLayerout ['varclass'] );
	}
	/**
	 * 批量获取商品信息 ，taobao method: taobao.items.list.get
	 * <br/>1.传入的iids所对应的商品必须属于同一个用户 2.查看非公开属性时需要用户登录 3.同时传入iids和num_iids以num_iids为主
	 * @param ItemGetListResult $result   要填充商品列表结果
	 * @param string  $num_iids 商品数字id列表，多个num_iid用逗号隔开，一次不超过20个。
	 * @param string  $iids  商品字符串编号或数字编号均可，也可以混合使用，多个iid用逗号隔开，一次不超过20个。
	 * @param string $fields 需要返回的商品对象字段。可选值：Item商品结构体中所有字段均可返回；
	 * 多个字段用“,”分隔。如果想返回整个子对象，那字段为itemimg，如果是想返回子对象里面的字段，那字段为itemimg.url。
	 * @return array 已经填充商品列表，类型@see TItem
	 */
	function &readItemsList($num_iids, $iids = NULL, $fields = NULL, $needdesc = false)
	{
		if (! $num_iids && ! $iids)
			throw new TaoBaoRuntimeExecption ( - 1, 'readItemsList运行失败：参数错误' );
		
		$paramarr = array ('num_iids' => $num_iids, 'iids' => $iids );
		if (! $fields)
		{
			$fields = &$this->_getFields ( new TItem () );
			if (! $needdesc)
				$fields = str_replace ( ',desc', '', $fields );
			$fields .= ',item_img,prop_img,sku,video,one_station';
		}
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.items.list.get', $paramarr );
		$result = new ItemGetListResult ();
		$this->__firefillProperty ( $result, $resultarr, ItemGetListResult::$_DataLayerout ['varclass'] );
		return $result->items;
	}
	/**
	 * 得到单个商品信息 ，taobao method: taobao.item.get
	 * <br/>获取单个商品的详细信息
	 * <br/>卖家未登录时只能获得这个商品的公开数据，卖家登录后可以获取商品的所有数据
	 * <br/>怎样取到自定义颜色属性名? 在取商品的时候，加上 property_alias字段，
	 * 返回结果如: "1627207: 90554: 金色"其中1627207: 90554是pid: vid对和props字段中的pid: vid
	 * 解析方式一样。"金色"颜色是别名。
	 * <br/>为什么下架商品取不到?只有商品的所有者登录后才能看到下架的商品。
	 * <br/>直冲类商品取不到商品?商城的直冲商品，现在还不支持。
	 * @param TItem $result   要填充商品对象
	 * @param string $nick    卖家昵称,如果昵称为中文，要用UTF-8编码
	 * @param string $iid     商品id 
	 * @param string $num_iid 商品数字id  
	 * @param string $fields  需要返回的商品对象字段。
	 * 可选值：Item商品结构体中所有字段均可返回；多个字段用“,”分隔。
	 * 如果想返回整个子对象，那字段为item_img， 如果是想返回子对象里面的字段，
	 * 那字段为item_img.url。 新增返回字段：one_station标记商品是否淘1站商品
	 * <br/>如果为空，自动返回所有字段
	 * @param boolean $needdesc 是否需要desc字段，默认false，仅当$fields=NULL有效。
	 * desc字段字数要大于5个字节，小于25000个字节，一般较大，如需要单独取得。
	 * @return array 已经填充商品列表结果，类型@see ItemGetListResult
	 */
	function readItem(ShopexItem $result, $goods_id,$fields = NULL)
	{
		if (! $goods_id )
			throw new TaoBaoRuntimeExecption ( - 1, 'readItemsAll运行失败：参数错误' );
		
		$paramarr['searchParam'] =json_encode(array ( 'goods_id' => $goods_id ));
		if (! $fields)
		{
			$fields = &$this->_getFields ( new ShopexItem () );
	
		}
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'good.getfullinfo', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, ShopexItem::$_DataLayerout ['varclass'] );
	}
	
	/**
	 * 根据卖家设定的商品外部id获取商品 ，taobao method: taobao.items.custom.get
	 * <br/>跟据卖家设定的商品外部id获取商品 这个商品对应卖家从传入的session中获取，需要session绑定
	 * <br/>什么是商品的外部商家ID？外部商家自己定义的商品ID 
	 * @param array $result   要填充商品对象列表
	 * @param string $outer_id    商品的外部商品ID 
	 * @param string $fields  需要返回的商品对象字段。
	 * 可选值：Item商品结构体中所有字段均可返回；多个字段用“,”分隔。
	 * 如果想返回整个子对象，那字段为item_img， 如果是想返回子对象里面的字段，
	 * 那字段为item_img.url。 新增返回字段：one_station标记商品是否淘1站商品
	 * <br/>如果为空，自动返回所有字段
	 * @param boolean $needdesc 是否需要desc字段，默认false，仅当$fields=NULL有效。
	 * desc字段字数要大于5个字节，小于25000个字节，一般较大，如需要单独取得。
	 * @return array 已经填充商品列表结果，类型@see TItem
	 */
	function &readItemsCustom(array &$result, $outer_id, $fields = NULL, $needdesc = false)
	{
		if (! $outer_id)
			throw new TaoBaoRuntimeExecption ( - 1, 'readItemsCustom运行失败：参数错误' );
		
		$paramarr = array ('outer_id' => $outer_id );
		if (! $fields)
		{
			$fields = &$this->_getFields ( new TItem () );
			if (! $needdesc)
				$fields = str_replace ( ',desc', '', $fields );
			$fields .= ',item_img,prop_img,sku,video,one_station'; //add class			
		}
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.items.custom.get', $paramarr );
		$list = new ItemGetListResult ();
		$this->__firefillProperty ( $list, $resultarr, ItemGetListResult::$_DataLayerout ['varclass'] );
		$result = $list->items;
		return $result;
	}
	/**
	 * 获取单个SKU，taobao method: taobao.item.sku.get
	 * <br/>获取sku_id所对应的sku数据
	 * <br/>sku_id对应的sku要属于传入的nick对应的卖家
	 * @param Sku $result   要填充Sku
	 * @param integer $sku_id    Sku的id。可以通过taobao.item.get得到 
	 * @param integer $num_iid    商品的数字IID 
	 * @param string $fields  需返回的字段列表。可选值：Sku结构体中的所有字段；
	 * 字段之间用“,”分隔。 <br/>如果为空，自动返回所有字段
	 * @return array 已经填充Sku，类型@see Sku
	 */
	function readItemSku(Sku $result, $sku_id, $num_iid, $fields = NULL)
	{
		if (! $result || ! $sku_id || ! $num_iid)
			throw new TaoBaoRuntimeExecption ( - 1, 'readItemSku运行失败：参数错误' );
		
		$paramarr = array ('sku_id' => $sku_id, 'num_iid' => $num_iid );
		if (! $fields)
			$fields = &$this->_getFields ( $result );
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.item.sku.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 根据卖家昵称和商品ID列表获取SKU信息，taobao method: taobao.item.skus.get
	 * <br/>获取多个商品下的所有sku  <br/>输入的iid必须都属于nick对应的用户 
	 * <br/>同时传入iids和num_iids，以num_iids为主
	 * @param array $result   要填充Sku列表
	 * @param string $nick   商品所属卖家昵称  
	 * @param string $num_iids  商品数字ID列表，多个之间用“,”分隔，最多40个。iids和num_iids选择一个传入  
	 * @param string $iids   商品字符串ID列表，多个之间用“,”分隔，最多40个。iids和num_iids选择一个传入 
	 * @param string $fields  需返回的字段列表。可选值：Sku结构体中的所有字段；
	 * 字段之间用“,”分隔。 <br/>如果为空，自动返回所有字段
	 * @return array 已经填充Sku列表，类型@see Sku
	 */
	function readItemSkus(array &$result, $nick, $num_iids, $iids = NULL, $fields = NULL)
	{
		if (! $nick || (! $num_iids && ! $iids))
			throw new TaoBaoRuntimeExecption ( - 1, 'readItemSkus运行失败：参数错误' );
		
		$paramarr = array ('nick' => $nick, 'num_iids' => $num_iids, 'iids' => $iids );
		if (! $fields)
			$fields = &$this->_getFields ( new Sku () );
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.item.skus.get', $paramarr );
		$list = new TItem ();
		$this->__firefillProperty ( $list, $resultarr, array ('skus' => 'Sku' ) );
		$result = $list->skus;
		return $result;
	}
	/**
	 * 根据外部ID取商品SKU，taobao method: taobao.skus.custom.get
	 * <br/>跟据卖家设定的Sku的外部id获取商品，如果一个outer_id对应多个Sku会返回所有符合条件的sku 
	 * <br/>这个Sku所属卖家从传入的session中获取，需要session绑定
	 * @param array $result   要填充Sku列表
	 * @param string $outer_id   Sku的外部商家ID  
	 * @param string $fields  需返回的字段列表。可选值：Sku结构体中的所有字段；
	 * 字段之间用“,”分隔。 <br/>如果为空，自动返回所有字段
	 * @return array 已经填充Sku列表，类型@see Sku
	 */
	function readSkusCustom(array &$result, $outer_id, $fields = NULL)
	{
		if (! $outer_id)
			throw new TaoBaoRuntimeExecption ( - 1, 'readSkusCustom运行失败：参数错误' );
		
		$paramarr = array ('outer_id' => $outer_id );
		if (! $fields)
			$fields = &$this->_getFields ( new Sku () );
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.skus.custom.get', $paramarr );
		$list = new TItem ();
		$this->__firefillProperty ( $list, $resultarr, array ('skus' => 'Sku' ) );
		$result = $list->skus;
		return $result;
	}
	/**
	 * 搜索商品信息 ，taobao method: taobao.items.search
	 * <br/>搜索商品全部信息，包括类目及数量
	 * @param TaobaoItemSearchResult $result   要填充搜索商品信息结果
	 * @param TaobaoItemSearchParam $param      搜索商品信息参数
	 * @param string $fields 需返回的商品结构字段列表。
	 * 可选值为Item中的以下字段：iid,title,nick,pic_url,cid,price,type,delist_time,post_fee；
	 * 多个字段之间用“,” 分隔。如：iid,title。
	 * 新增字段location（卖家地址，可以分别获取location.city,location.state）
	 * <br/>如果为空，自动返回所有支持的字段
	 * @return TaobaoItemSearchResult 已经填充搜索商品信息结果
	 */
	function readItemsSearch(TaobaoItemSearchResult $result, TaobaoItemSearchParam $param, $fields = NULL)
	{
		if (! $param || ! $result)
			throw new TaoBaoRuntimeExecption ( - 1, 'readItemsSearch运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		if (! $fields)
		{
			$fields = 'iid,title,nick,pic_url,cid,price,type,delist_time,post_fee,location.city,location.state';
		}
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.items.search', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaoItemSearchResult::$_DataLayerout ['varclass'] );
	}
	/**
	 * 添加一个商品，taobao method: taobao.item.add
	 * <br/>此接口用于新增一个商品 商品所属的卖家是当前会话的用户 商品的属性和sku的属性有包含的关系，商品的价格要位于sku的价格区间之中
	 * （例如，sku价格有5元、10元两种，那么商品的价格就需要大于等于5元，小于等于10元，否则新增商品会失败） 商品的类目和商品的价格、sku的价格都有一定的相关性
	 * （具体的关系要通过类目属性查询接口获得） 商品的运费承担方式和邮费设置有相关性，卖家承担运费不用设置邮费，
	 * 买家承担运费需要设置邮费 当关键属性值选择了“其他”的时候，需要输入input_pids和input_str商品才能添加成功。
	 * <br/>添加一个商品，必须设置参数：num,price,type,stuff_status,title,desc,location.state,location.city,cid
	 * @param TaobaoItemAddParam $param   添加商品参数
	 * @return TItem 商品结构，包括：num_iid,created
	 */
	function writeItemAdd(TaobaoItemAddParam $param)
	{
		if (! $param || ! $param->num || ! $param->price || ! $param->type || ! $param->stuff_status || ! $param->title || ! $param->desc || ! $param->location_state || ! $param->location_city || ! $param->cid)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeItemAdd运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		unset ( $paramarr ['location_city'] );
		unset ( $paramarr ['location_state'] );
		unset ( $paramarr ['image'] );
		if ($param->location_city)
			$paramarr ['location.city'] = $param->location_city;
		if ($param->location_state)
			$paramarr ['location.state'] = $param->location_state;
		if (! $param->pic_path && $param->image && file_exists ( $param->image ))
		{
			$request = clone $this->request;
			$request->httpmethod = TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
			$request->postWithFiles ['image'] = $param->image;
			$resultarr = &$this->__fireRequest ( 'taobao.item.add', $paramarr, false, $request );
			$request = NULL;
		}
		else
		{
			$resultarr = &$this->__fireRequest ( 'taobao.item.add', $paramarr, false );
		}
		$result = new TItem ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 删除单条商品，taobao method: taobao.item.delete
	 * @param integer $num_iid   商品数字ID。
	 * @param string $iid       商品ID。
	 * @return TItem 商品结构，包括：num_iid,created
	 */
	function writeItemDelete($num_iid, $iid = NULL)
	{
		if (! $num_iid && ! $iid)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeItemDelete运行失败：参数错误' );
		
		$paramarr = array ('num_iid' => $num_iid, 'iid' => $iid );
		$resultarr = &$this->__fireRequest ( 'taobao.item.delete', $paramarr );
		$result = new TItem ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 更新商品信息，taobao method: taobao.item.update
	 * <br/>根据传入的iid更新对应的商品的数据  
	 * <br/>传入的iid所对应的商品必须属于当前会话的用户
	 * <br/>商品的属性和sku的属性有包含的关系，商品的价格要位于sku的价格区间之中
	 * （例如，sku价格有5元、10元两种，那么商品的价格就需要大于等于5元，小于等于10元， 否则更新商品会失败）
	 * <br/>商品的类目和商品的价格、sku的价格都有一定的相关性（具体的关系要通过类目属性查询接口获得）
	 * <br/>当关键属性值更新为“其他”的时候，需要输入input_pids和input_str商品才能更新成功
	 * <br/>如果要更新多个sku信息的，sku _quantities，sku _prices，sku_outer_ids，
	 * sku _properties这些信息是必填的 <br/>同时传入iid和num_iid，以num_iid为主
	 * @param TaobaoItemUpdateParam $param   要更新商品信息的参数， <br/>iid和num_iid选择一个传入
	 * @return string 商品修改时间 时间格式：yyyy-MM-dd HH:mm:ss 
	 */
	function writeItemUpdate(TaobaoItemUpdateParam $param)
	{
		if (! $param || (! $param->num_iid && ! $param->iid))
			throw new TaoBaoRuntimeExecption ( - 1, 'writeItemUpdate运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		unset ( $paramarr ['location_city'] );
		unset ( $paramarr ['location_state'] );
		unset ( $paramarr ['image'] );
		if ($param->location_city)
			$paramarr ['location.city'] = $param->location_city;
		if ($param->location_state)
			$paramarr ['location.state'] = $param->location_state;
		if (! $param->pic_path && $param->image && file_exists ( $param->image ))
		{
			$request = clone $this->request;
			$request->httpmethod = TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
			$request->postWithFiles ['image'] = $param->image;
			$resultarr = &$this->__fireRequest ( 'taobao.item.update', $paramarr, true, $request );
			$request = NULL;
		}
		else
			$resultarr = &$this->__fireRequest ( 'taobao.item.update', $paramarr );
		$list = new stdClass ();
		$this->__firefillProperty ( $list, $resultarr );
		if (property_exists ( $list, 'modified' ))
			return $list->modified;
	}
	/**
	 * 删除商品图片，taobao method: taobao.item.img.delete
	 * @param integer $id        商品图片ID
	 * @param integer $num_iid   商品数字ID。
	 * @param string $iid       商品ID。
	 * @return TaobaoItemImg 商品图片结构，包括：num_iid,created
	 */
	function writeItemImgDelete($id, $num_iid, $iid = NULL)
	{
		if (! $num_iid || ! isset ( $id ))
			throw new TaoBaoRuntimeExecption ( - 1, 'writeItemImgDelete运行失败：参数错误' );
		
		$paramarr = array ('id' => $id, 'num_iid' => $num_iid, 'iid' => $iid );
		$resultarr = &$this->__fireRequest ( 'taobao.item.img.delete', $paramarr );
		$result = new TaobaoItemImg ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 添加商品图片，taobao method: taobao.item.img.upload
	 * <br/>添加一张商品图片到iid指定的商品中 传入的iid所对应的商品必须属于当前会话的用户 如果更新图片需要设置itemimg_id，
	 * 且该itemimg_id的图片记录需要属于传入的iid对应的商品。如果新增图片则不用设置 商品图片有数量和大小上的限制，
	 * 根据卖家享有的服务（如：卖家订购了多图服务等），商品图片数量限制不同。
	 * @param TaobaoItemImgUploadParam $param   添加商品图片参数
	 * @return TaobaoItemImg 商品图片结构，包括：num_iid,created
	 */
	function writeItemImgUpload(TaobaoItemImgUploadParam $param)
	{
		if (! $param || (! $param->num_iid && ! $param->iid))
			throw new TaoBaoRuntimeExecption ( - 1, 'writeItemImgUpload运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		unset ( $paramarr ['image'] );
		if ($param->image && file_exists ( $param->image ))
		{
			$request = clone $this->request;
			$request->httpmethod = TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
			$request->postWithFiles ['image'] = $param->image; //old use  "image",now use "imageData"  2010-08-10
			$resultarr = &$this->__fireRequest ( 'taobao.item.img.upload', $paramarr, false, $request );
			$request = NULL;
		}
		else
			$resultarr = &$this->__fireRequest ( 'taobao.item.img.upload', $paramarr, false );
		$result = new TaobaoItemImg ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * @deprecated 商品关联子图，taobao method: taobao.item.joint.img
	 * @param TaobaoItemImgJointParam $param   关联商品图片参数
	 * @return TaobaoItemImg 商品图片结构，包括：num_iid,created
	 */
	function writeItemJointImg(TaobaoItemImgJointParam $param)
	{
		if (! $param || (! $param->num_iid && ! $param->iid) || ! $param->pic_path)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeItemJointImg运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		$resultarr = &$this->__fireRequest ( 'taobao.item.joint.img', $paramarr, false );
		$result = new TaobaoItemImg ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * @deprecated 商品关联属性图，taobao method: taobao.item.joint.propimg
	 * @param TaobaoItemPropImgJointParam $param   关联商品属性图片参数
	 * @return TaobaoPropImg 属性图片对象信息，包括：num_iid,created
	 */
	function writeItemJointPropImg(TaobaoItemPropImgJointParam $param)
	{
		if (! $param || (! $param->num_iid && ! $param->iid) || ! $param->pic_path || ! $param->properties)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeItemJointPropImg运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		$resultarr = &$this->__fireRequest ( 'taobao.item.joint.propimg', $paramarr, false );
		$result = new TaobaoPropImg ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 删除属性图片，taobao method: taobao.item.propimg.delete
	 * @param integer $id        商品图片ID
	 * @param integer $num_iid   商品数字ID。
	 * @param string $iid       商品ID。
	 * @return TaobaoPropImg 属性图片对象信息，包括：num_iid,created
	 */
	function writeItemPropImgDelete($id, $num_iid, $iid = NULL)
	{
		if (! $num_iid || ! $id)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeItemPropImgDelete运行失败：参数错误' );
		
		$paramarr = array ('id' => $id, 'num_iid' => $num_iid, 'iid' => $iid );
		$resultarr = &$this->__fireRequest ( 'taobao.item.propimg.delete', $paramarr );
		$result = new TaobaoPropImg ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 添加或修改属性图片，taobao method: taobao.item.propimg.upload
	 * @param TaobaoItemPropImgUploadParam $param   添加或修改属性图片参数
	 * @return TaobaoPropImg 属性图片对象信息，包括：num_iid,created
	 */
	function writeItemPropImgUpload(TaobaoItemPropImgUploadParam $param)
	{
		if (! $param || (! $param->num_iid && ! $param->iid) || ! $param->image)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeItemPropImgUpload运行失败：参数错误' );
		if (! file_exists ( $param->image ))
			throw new TaoBaoRuntimeExecption ( - 1, 'writeItemPropImgUpload运行失败：找不到' . $param->image );
		$paramarr = get_object_vars ( $param );
		unset ( $paramarr ['image'] );
		$request = clone $this->request;
		$request->httpmethod = TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
		$request->postWithFiles ['image'] = $param->image;
		$resultarr = &$this->__fireRequest ( 'taobao.item.propimg.upload', $paramarr, false, $request );
		$request = NULL;
		$result = new TaobaoPropImg ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 橱窗推荐一个商品，taobao method: taobao.item.recommend.add
	 * @param integer $num_iid   商品数字ID。
	 * @param string $iid       商品ID。
	 * @return TItem 商品结构，包括：iid
	 */
	function writeItemRecommendAdd($num_iid, $iid = NULL)
	{
		if (! $num_iid && ! $iid)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeItemRecommendAdd运行失败：参数错误' );
		$paramarr = array ('num_iid' => $num_iid, 'iid' => $iid );
		$resultarr = &$this->__fireRequest ( 'taobao.item.recommend.add', $paramarr );
		$result = new TItem ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 取消橱窗推荐一个商品，taobao method: taobao.item.recommend.delete
	 * @param integer $num_iid   商品数字ID。
	 * @param string $iid       商品ID。
	 * @return TItem 商品结构，包括：iid,modified
	 */
	function writeItemRecommendDelete($num_iid, $iid = NULL)
	{
		if (! $num_iid && ! $iid)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeItemRecommendDelete运行失败：参数错误' );
		$paramarr = array ('num_iid' => $num_iid, 'iid' => $iid );
		$resultarr = &$this->__fireRequest ( 'taobao.item.recommend.delete', $paramarr );
		$result = new TItem ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 更新商品特定字段(TBS专用)，taobao method: taobao.item.tbsupdate
	 * @param integer $num_iid   商品数字ID。
	 * @param boolean $is_taobao 是否在淘宝显示。is_taobao和is_ex两个中至少输入一个
	 * @param boolean $is_ex     是否在外部网店显示。is_taobao和is_ex两个中至少输入一个
	 * @param string $iid        商品ID。
	 * @return TItem 商品结构，包括：num_iid,modified
	 */
	function writeItemTbsUpdate($num_iid, $is_taobao, $is_ex, $iid = NULL)
	{
		if ((! $num_iid && ! $iid) || (! isset ( $is_taobao ) && ! isset ( $is_ex )))
			throw new TaoBaoRuntimeExecption ( - 1, 'writeItemTbsUpdate运行失败：参数错误' );
		$paramarr = array ('num_iid' => $num_iid, 'is_taobao' => $is_taobao, 'is_ex' => $is_ex, 'iid' => $iid );
		$resultarr = &$this->__fireRequest ( 'taobao.item.tbsupdate', $paramarr );
		$result = new TItem ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 商品下架，taobao method: taobao.item.update.delisting
	 * <br/>单个商品下架 * 输入的num_iid必须属于当前会话用户
	 * @param integer $num_iid   商品数字ID。
	 * @param string $iid       商品ID。
	 * @return TItem 商品结构，包括：iid,modified
	 */
	function writeItemUpdateDelisting($num_iid, $iid = NULL)
	{
		if (! $num_iid && ! $iid)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeItemUpdateDelisting运行失败：参数错误' );
		$paramarr = array ('num_iid' => $num_iid, 'iid' => $iid );
		$resultarr = &$this->__fireRequest ( 'taobao.item.update.delisting', $paramarr );
		$result = new TItem ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 一口价商品上架，taobao method: taobao.item.update.listing
	 * <br/>单个商品上架 * 输入的num_iid必须属于当前会话用户
	 * @param integer $num_iid   商品数字ID。
	 * @param integer $num   需要上架的商品的数量。取值范围:大于零的整数。
	 * 如果商品有sku，则上架数量默认为所有sku数量总和，不可修改。 否则商品数量根据设置数量调整为 num
	 * @param string $iid       商品ID。
	 * @return TItem 商品结构，包括：iid,modified
	 */
	function writeItemUpdateListing($num_iid, $num, $iid = NULL)
	{
		if (! $num && (! $num_iid && ! $iid))
			throw new TaoBaoRuntimeExecption ( - 1, 'writeItemUpdateDelisting运行失败：参数错误' );
		$paramarr = array ('num_iid' => $num_iid, 'num' => $num, 'iid' => $iid );
		$resultarr = &$this->__fireRequest ( 'taobao.item.update.listing', $paramarr );
		$result = new TItem ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 添加SKU，taobao method: taobao.item.sku.add
	 * <br/>新增一个sku到iid指定的商品中 <br/>传入的iid所对应的商品必须属于当前会话的用户
	 * <br/>同时传入iid和num_iid，以num_iid为主
	 * @param SkuParam $param   要添加Sku参数<br/>iid和num_iid选择一个传入 
	 * <br/>properties是必须参数 <br/>price 必须参数   商品的价格要在商品所有的sku的价格之间
	 * <br/>quantity 必须参数   sku的总数量应该小于等于商品总数量(Item的NUM)。取值范围:大于零的整数 
	 * @return string 创建时间。格式:yyyy-MM-dd HH:mm:ss 
	 */
	function writeItemSkuAdd(SkuParam $param)
	{
		if (! $param || ! $param->properties || $param->quantity || $param->price || (! $param->num_iid && ! $param->iid))
			throw new TaoBaoRuntimeExecption ( - 1, 'writeItemSkuAdd运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		$resultarr = &$this->__fireRequest ( 'taobao.item.sku.add', $paramarr, false );
		$list = new stdClass ();
		$this->__firefillProperty ( $list, $resultarr );
		if (property_exists ( $list, 'created' ))
			return $list->created;
	}
	/**
	 * 更新SKU信息，taobao method: taobao.item.sku.update
	 * <br/>更新一个sku的数据  <br/>需要更新的sku通过属性properties进行匹配查找
	 * <br/>商品的数量和价格必须大于等于0 <br/>sku记录会更新到指定的iid对应的商品中
	 * <br/>iid对应的商品必须属于当前的会话用户 <br/>同时传入iid和num_iid，以num_iid为主
	 * <br/>taobao.item.sku.update能否同时更新多组sku?不能同时更新多组sku,只能每次更新一组
	 * @param SkuParam $param   要更新Sku参数<br/>iid和num_iid选择一个传入<br/>properties是必须参数
	 * <br/>quantity sku的总数量应该小于等于商品总数量(Item的NUM)。取值范围:大于等于零的整数
	 * <br/>price 修改后的sku价格要保证商品的价格在所有sku价格所形成的价格区间内
	 * （例如：商品价格为6元，sku价格有5元、10元两种，如果要修改5元sku的价格， 那么修改的范围
	 * 只能是0-6元之间；如果要修改10元的sku， 那么修改的范围只能是6到无穷大的区间中）
	 * @return string Sku的修改时间。格式:yyyy-MM-dd HH:mm:ss
	 */
	function writeItemSkuUpdate(SkuParam $param)
	{
		if (! $param || ! $param->properties || (! $param->num_iid && ! $param->iid))
			throw new TaoBaoRuntimeExecption ( - 1, 'writeItemSkuUpdate运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		$resultarr = &$this->__fireRequest ( 'taobao.item.sku.update', $paramarr );
		$list = new stdClass ();
		$this->__firefillProperty ( $list, $resultarr );
		if (property_exists ( $list, 'modified' ))
			return $list->modified;
	}
	
	/**
	 * 删除SKU，taobao method: taobao.item.sku.delete
	 * <br/>删除一个sku的数据  <br/>需要删除的sku通过属性properties进行匹配查找
	 * <br/>可删除还有剩余库存的SKU <br/>同时传入iid和num_iid，以num_iid为主
	 * @param SkuParam $param   要删除Sku参数 <br/>iid和num_iid选择一个传入<br/>properties是必须参数
	 * <br/>quantity sku所属商品的数量,大于0的整数。当用户删除sku，
	 * 使商品数量不等于sku数量之和时候，用于修改商品的数量，使sku能够删除成功。
	 * 特别是删除最后一个sku的时候，一定要设置商品数量到正常的值，否则删除失败 
	 * <br/>price    sku所属商品的价格。当用户删除sku，使商品价格不属于sku价格之间的时候，
	 * 用于修改商品的价格，使sku能够删除成功
	 * @return string Sku的删除时间。格式:yyyy-MM-dd HH:mm:ss
	 */
	function writeItemSkuDelete(SkuParam $param)
	{
		if (! $param || ! $param->properties || (! $param->num_iid && ! $param->iid))
			throw new TaoBaoRuntimeExecption ( - 1, 'writeItemSkuDelete运行失败：参数错误' );
		
		$paramarr = array ('iid' => $param->iid, 'num_iid' => $param->num_iid, 'properties' => $param->properties, 'item_price' => $param->price, 'item_num' => $param->quantity, 'lang' => $param->lang );
		
		$resultarr = &$this->__fireRequest ( 'taobao.item.sku.delete', $paramarr, false );
		$list = new stdClass ();
		$this->__firefillProperty ( $list, $resultarr );
		if (property_exists ( $list, 'modified' ))
			return $list->modified;
	}
	/**
	 * 添加邮费模板，taobao method: taobao.postage.add
	 * @param TaobaoPostageAddParam $param   添加邮费模板参数
	 * <br/>必填字段:name。特殊可选：post,express,ems
	 * @return TaobaoPostage 返回参数， 包括postage_id：运费模板ID；created：创建日期 ，格式：yyyy-MM-dd HH:mm:ss
	 */
	function writePostageAdd(TaobaoPostageAddParam $param)
	{
		if (! $param || ! $param->name)
			throw new TaoBaoRuntimeExecption ( - 1, 'writePostageAdd运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		$resultarr = &$this->__fireRequest ( 'taobao.postage.add', $paramarr, false );
		$result = new TaobaoPostage ();
		return $this->__firefillProperty ( $result, $resultarr, TaobaoPostage::$_DataLayerout ['varclass'] );
	}
	/**
	 * 删除单个运费模板，taobao method: taobao.postage.delete
	 * @param integer $postage_id   邮费模板id
	 * @return TaobaoPostage 返回参数， 包括postage_id：运费模板ID；created：创建日期 ，格式：yyyy-MM-dd HH:mm:ss
	 */
	function writePostageDelete($postage_id)
	{
		if (! $postage_id)
			throw new TaoBaoRuntimeExecption ( - 1, 'writePostageDelete运行失败：参数错误' );
		
		$paramarr = array ('postage_id' => $postage_id );
		$resultarr = &$this->__fireRequest ( 'taobao.postage.delete', $paramarr, false );
		$result = new TaobaoPostage ();
		return $this->__firefillProperty ( $result, $resultarr, TaobaoPostage::$_DataLayerout ['varclass'] );
	}
	/**
	 * 修改邮费模板，taobao method: taobao.postage.update
	 * @param TaobaoPostageUpdateParam $param   修改邮费模板参数
	 * <br/>必填字段:postage_id。特殊可选：post,express,ems
	 * @return TaobaoPostage 返回参数， 包括postage_id：运费模板ID；created：创建日期 ，格式：yyyy-MM-dd HH:mm:ss
	 */
	function writePostageUpdate(TaobaoPostageUpdateParam $param)
	{
		if (! $param || ! $param->postage_id)
			throw new TaoBaoRuntimeExecption ( - 1, 'writePostageUpdate运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		$resultarr = &$this->__fireRequest ( 'taobao.postage.update', $paramarr, false );
		$result = new TaobaoPostage ();
		return $this->__firefillProperty ( $result, $resultarr, TaobaoPostage::$_DataLayerout ['varclass'] );
	}
	/**
	 * 获取卖家的运费模板，taobao method: taobao.postages.get
	 * @param array $result 要填充的卖家的运费模板列表，类型：@see TaobaoPostage
	 * @param string $fields 需返回的字段列表.如果为空，自动传入TaobaoPostage结构体的所有字段
	 * <br/>可选值:TaobaoPostage结构体中的所有字段;字段之间用","分隔。 
	 * @return array 返回已经填充的卖家的运费模板，类型：@see TaobaoPostage
	 */
	function &readPostages(array &$result, $fields = NULL)
	{
		if (! isset ( $result ))
			throw new TaoBaoRuntimeExecption ( - 1, 'readPostages运行失败：参数错误' );
		
		$paramarr = array ();
		if (! $fields)
		{
			$fields = &$this->_getFields ( new TaobaoPostage () );
			$fields .= ',postage_mode.id,postage_mode.type,postage_mode.dests,postage_mode.price,postage_mode.increase';
		}
		$paramarr ['fields'] = $fields;
		$resultarr = &$this->__fireRequest ( 'taobao.postages.get', $paramarr );
		$list = new _TaobaoPostageList ();
		$this->__firefillProperty ( $list, $resultarr, _TaobaoPostageList::$_DataLayerout ['varclass'] );
		$result = $list->postages;
		return $result;
	}
	/**
	 * 获取单个运费模板，taobao method: taobao.postage.get
	 * @param TaobaoPostage $result 要填充的运费模板
	 * @param string $postage_id 邮费模板id
	 * @param string $nick 卖家昵称
	 * @param string $fields 需返回的字段列表.如果为空，自动传入TaobaoPostage结构体的所有字段
	 * <br/>可选值:TaobaoPostage结构体中的所有字段;字段之间用","分隔。 
	 * @return TaobaoPostage 返回已经填充的运费模板
	 */
	function readPostage(TaobaoPostage $result, $postage_id, $nick, $fields = NULL)
	{
		if (! $result || ! $postage_id || ! $nick)
			throw new TaoBaoRuntimeExecption ( - 1, 'readPostage运行失败：参数错误' );
		
		$paramarr = array ('postage_id' => $postage_id, 'nick' => $nick );
		if (! $fields)
		{
			$fields = &$this->_getFields ( $result );
			$fields .= ',postage_mode.id,postage_mode.type,postage_mode.dests,postage_mode.price,postage_mode.increase';
		}
		$paramarr ['fields'] = $fields;
		$resultarr = &$this->__fireRequest ( 'taobao.postage.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaoPostage::$_DataLayerout ['varclass'] );
	}
	/**
	 * 获取一个产品的信息，taobao method: taobao.product.get 
	 * @param TaobaoProduct $result 要填充的产品信息
	 * @param string $product_id Product的id.两种方式来查看一个产品:1.传入product_id来查询 2.传入cid和props来查询
	 * @param string $cid 商品类目id.调用taobao.itemcats.get获取;必须是叶子类目id,如果没有传product_id,那么cid和props必须要传
	 * @param string $props 比如:诺基亚N73这个产品的关键属性列表就是:品牌:诺基亚;型号:N73,对应的PV值就是10005:10027;10006:29729
	 * @param string $fields 需返回的字段列表.
	 * 如果为空，自动传入Product结构体的所有字段，包括product_imgs,product_prop_imgs;
	 * <br/>可选值:Product数据结构中的所有字段;多个字段之间用","分隔。 
	 * @return TaobaoProduct 返回已经填充的产品信息
	 */
	function readProduct(TaobaoProduct $result, $product_id, $cid = NULL, $props = NULL, $fields = NULL)
	{
		if (! $result || (! $product_id && (! $cid || ! $props)))
			throw new TaoBaoRuntimeExecption ( - 1, 'readProduct运行失败：参数错误' );
		
		$paramarr = array ('product_id' => $product_id, 'cid' => $cid, 'props' => $props );
		if (! $fields)
		{
			$fields = &$this->_getFields ( $result );
			$fields .= ',product_imgs.id,product_imgs.url,product_imgs.position,product_imgs.created,product_imgs.modified';
			$fields .= ',product_prop_imgs.id,product_prop_imgs.props,product_prop_imgs.url,product_prop_imgs.position,product_prop_imgs.created,product_prop_imgs.modified';
		}
		$paramarr ['fields'] = $fields;
		$resultarr = &$this->__fireRequest ( 'taobao.product.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaoProduct::$_DataLayerout ['varclass'] );
	}
	/**
	 * 获取产品列表，taobao method: taobao.products.get 
	 * @param array $result 要填充的产品列表，类型@TaobaoProduct
	 * @param string $nick 卖家昵称
	 * @param string $page_no 页码.传入值为1代表第一页,传入值为2代表第二页,依此类推.默认返回的数据是从第一页开始.
	 * @param string $page_size 每页条数.每页返回最多返回100条,默认值为40.
	 * @param string $fields 需返回的字段列表.
	 * 如果为空，自动传入Product结构体的所有字段，不包括product_imgs,product_prop_imgs;
	 * 如果为ALL，自动传入Product结构体的所有字段，包括product_imgs,product_prop_imgs;
	 * <br/>可选值:Product数据结构中的所有字段;多个字段之间用","分隔。 
	 * @return array 返回已经填充的产品列表，类型@TaobaoProduct
	 */
	function &readProducts(array &$result, $nick, $page_no = 1, $page_size = 40, $fields = NULL)
	{
		if (! isset ( $result ) || ! $nick)
			throw new TaoBaoRuntimeExecption ( - 1, 'readProducts运行失败：参数错误' );
		
		$paramarr = array ('nick' => $nick, 'page_no' => $page_no, 'page_size' => $page_size );
		if (! $fields || $fields === 'ALL')
		{
			$fields = &$this->_getFields ( new TaobaoProduct () );
			if ($fields === 'ALL')
			{
				$fields .= ',product_imgs.id,product_imgs.url,product_imgs.position,product_imgs.created,product_imgs.modified';
				$fields .= ',product_prop_imgs.id,product_prop_imgs.props,product_prop_imgs.url,product_prop_imgs.position,product_prop_imgs.created,product_prop_imgs.modified';
			}
		}
		$paramarr ['fields'] = $fields;
		$resultarr = &$this->__fireRequest ( 'taobao.products.get', $paramarr );
		$list = new TaobaoProductList ();
		$this->__firefillProperty ( $list, $resultarr, TaobaoProductList::$_DataLayerout ['varclass'] );
		$result = $list->products;
		return $result;
	}
	/**
	 * 获取产品列表，taobao method: taobao.products.search 
	 * @param TaobaoProductSearchResult $result 要填充的产品列表
	 * @param TaobaoProductSearchParam $param 获取产品列表参数
	 * @param string $fields 需返回的字段列表.
	 * 如果为空，自动传入Product结构体的所有字段，不包括product_imgs,product_prop_imgs;
	 * 如果为ALL，自动传入Product结构体的所有字段，包括product_imgs,product_prop_imgs;
	 * <br/>可选值:Product数据结构中的所有字段;多个字段之间用","分隔。 
	 * @return TaobaoProductSearchResult 返回已经填充的产品列表
	 */
	function readProductsSearch(TaobaoProductSearchResult $result, TaobaoProductSearchParam $param, $fields = NULL)
	{
		if (! $result || ! $param || (! $param->q && (! $param->cid || ! $param->props)))
			throw new TaoBaoRuntimeExecption ( - 1, 'readProductsSearch运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		if (! $fields || $fields === 'ALL')
		{
			$fields = &$this->_getFields ( new TaobaoProduct () );
			if ($fields === 'ALL')
			{
				$fields .= ',product_imgs.id,product_imgs.url,product_imgs.position,product_imgs.created,product_imgs.modified';
				$fields .= ',product_prop_imgs.id,product_prop_imgs.props,product_prop_imgs.url,product_prop_imgs.position,product_prop_imgs.created,product_prop_imgs.modified';
			}
		}
		$paramarr ['fields'] = $fields;
		$resultarr = &$this->__fireRequest ( 'taobao.products.search', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaoProductSearchResult::$_DataLayerout ['varclass'] );
	}
	/**
	 * 上传一个产品，不包括产品非主图和属性图片，包括产品主图，taobao method: taobao.product.add
	 * @param TaobaoProductAddParam $param   添加产品参数
	 * @return TaobaoProduct 返回参数， 包括product_id；created：创建日期 ，格式：yyyy-MM-dd HH:mm:ss
	 */
	function writeProductAdd(TaobaoProductAddParam $param)
	{
		if (! $param || ! $param->cid || ! $param->name || ! $param->price)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeProductAdd运行失败：参数错误' );
		if (! $param->image || ! file_exists ( $param->image ))
			throw new TaoBaoRuntimeExecption ( - 1, 'writeProductAdd运行失败：找不到产品主图片' );
		$paramarr = get_object_vars ( $param );
		unset ( $paramarr ['image'] );
		$request = clone $this->request;
		$request->httpmethod = TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
		$request->postWithFiles ['image'] = $param->image;
		$resultarr = &$this->__fireRequest ( 'taobao.product.add', $paramarr, false, $request );
		$request = NULL;
		$result = new TaobaoProduct ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 修改一个产品，可以修改主图，不能修改子图片，taobao method: taobao.product.update
	 * @param TaobaoProductUpdateParam $param   修改产品参数
	 * @return TaobaoProduct 返回参数， 包括product_id；created：创建日期 ，格式：yyyy-MM-dd HH:mm:ss
	 */
	function writeProductUpdate(TaobaoProductUpdateParam $param)
	{
		if (! $param || ! $param->product_id)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeProductUpdate运行失败：参数错误' );
		$paramarr = get_object_vars ( $param );
		unset ( $paramarr ['image'] );
		if ($param->image && file_exists ( $param->image ))
		{
			$request = clone $this->request;
			$request->httpmethod = TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
			$request->postWithFiles ['image'] = $param->image;
			$resultarr = &$this->__fireRequest ( 'taobao.product.update', $paramarr, false, $request );
			$request = NULL;
		}
		else
			$resultarr = &$this->__fireRequest ( 'taobao.product.update', $paramarr );
		$result = new TaobaoProduct ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 上传单张产品非主图，如果需要传多张，可调多次，taobao method: taobao.product.img.upload
	 * @param integer $product_id   产品ID,必须
	 * @param string $image   图片路径,必须,图片最大为500K,只支持JPG,GIF格式.
	 * @param integer $id   产品图片ID.修改图片时需要传入
	 * @param integer $position  图片序号
	 * @param integer $is_major  是否将该图片设为主图.可选值:true,false;默认值:false.
	 * @return TaobaoProductImg 返回参数， 包括url,id,created,modified
	 */
	function writeProductImgUpload($product_id, $image, $id = NULL, $position = NULL, $is_major = false)
	{
		if (! $product_id)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeProductImgUpload运行失败：参数错误' );
		if (! $image || ! file_exists ( $image ))
			throw new TaoBaoRuntimeExecption ( - 1, 'writeProductImgUpload运行失败：找不到图片' );
		$paramarr = array ('product_id' => $product_id, 'id' => $id, 'position' => $position, 'is_major' => $is_major );
		$request = clone $this->request;
		$request->httpmethod = TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
		$request->postWithFiles ['image'] = $image;
		$resultarr = &$this->__fireRequest ( 'taobao.product.img.upload', $paramarr, false, $request );
		$request = NULL;
		$result = new TaobaoProductImg ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 删除产品非主图，taobao method: taobao.product.img.delete
	 * @param integer $product_id   产品ID
	 * @param integer $id           产品图片ID.
	 * @return TaobaoProductImg     返回参数， 包括id,product_id
	 */
	function writeProductImgDelete($product_id, $id)
	{
		if (! $product_id || ! $id)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeProductImgDelete运行失败：参数错误' );
		$paramarr = array ('product_id' => $product_id, 'id' => $id );
		$resultarr = &$this->__fireRequest ( 'taobao.product.img.delete', $paramarr );
		$result = new TaobaoProductImg ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 上传单张产品属性图片，如果需要传多张，可调多次，taobao method: taobao.product.propimg.upload
	 * @param integer $product_id   产品ID.Product的id
	 * @param string $props   属性串.目前仅支持颜色属性.
	 * 调用taobao.itemprops.get获取类目属性,取得颜色属性pid,
	 * 再用taobao.itempropvalues.get取得vid;格式:pid:vid,只能传入一个颜色pid:vid串;
	 * @param string $image   图片路径,图片最大为2M,只支持JPG,GIF格式.
	 * @param integer $id     产品属性图片ID.修改图片时需要传入
	 * @param integer $position  图片序号
	 * @return TaobaoProductPropImg 返回参数， 包括url,id,created,modified
	 */
	function writeProductPropimgUpload($product_id, $props, $image, $id = NULL, $position = NULL)
	{
		if (! $product_id || ! $props)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeProductImgUpload运行失败：参数错误' );
		if (! $image || ! file_exists ( $image ))
			throw new TaoBaoRuntimeExecption ( - 1, 'writeProductImgUpload运行失败：找不到图片' );
		$paramarr = array ('product_id' => $product_id, 'id' => $id, 'position' => $position, 'props' => $props );
		$request = clone $this->request;
		$request->httpmethod = TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
		$request->postWithFiles ['image'] = $image;
		$resultarr = &$this->__fireRequest ( 'taobao.product.propimg.upload', $paramarr, false, $request );
		$request = NULL;
		$result = new TaobaoProductPropImg ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 删除产品属性图，taobao method: taobao.product.propimg.delete
	 * @param integer $product_id       产品ID.Product的id.
	 * @param integer $id               属性图片ID.
	 * @return TaobaoProductPropImg     返回参数， 包括id,product_id
	 */
	function writeProductPropimgDelete($product_id, $id)
	{
		if (! $product_id || ! $id)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeProductPropimgDelete运行失败：参数错误' );
		$paramarr = array ('product_id' => $product_id, 'id' => $id );
		$resultarr = &$this->__fireRequest ( 'taobao.product.propimg.delete', $paramarr );
		$result = new TaobaoProductPropImg ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 获取标准类目属性值，taobao method: taobao.itempropvalues.get
	 * <br/>传入类目ID,必需是叶子类目，通过taobao.itemcats.get获取类目ID  
	 * <br/>pvs和datetime二者必需传一个
	 * <br/>返回字段目前支持有：cid,pid,prop_name,vid,name,name_alias,status,sort_order 
	 * <br/>作用:获取标准类目属性值
	 * @param array $result   要填充属性值列表，类型@see PropValue，根据fields传入的参数返回相应的结果
	 * @param integer $cid    叶子类目ID ,通过taobao.itemcats.get获得叶子类目ID 
	 * @param string  $pvs    属性和属性值 id串，格式例如(pid1;pid2)
	 * 或(pid1:vid1;pid2:vid2)或(pid1;pid2:vid2),pvs和datetime二者必需传一个
	 * @param string  $datetime 增量时间戳。格式:yyyy-MM-dd HH:mm:ss,pvs和datetime二者必需传一个
	 * 假如传2005-01-01 00:00:00，则取所有的属性和子属性(状态为删除的属性值不返回prop_name)
	 * @param string  $last_modified 接口返回结果中的最近修改时间。格式:yyyy-MM-dd HH:mm:ss     
	 * @param string $fields  需返回的字段列表。可选值：PropValue结构体中的所有字段；
	 * 字段之间用“,”分隔。 <br/>如果为空，自动返回所有字段
	 * @return array 已经填充属性值列表，类型@see PropValue
	 */
	function &readItemPropValues(array &$result, $cid, $pvs, $datetime = '1970-01-01 00:00:00', &$last_modified = NULL, $fields = NULL)
	{
		if (! $cid || (! $pvs && ! $datetime))
			throw new TaoBaoRuntimeExecption ( - 1, 'readItemPropValues运行失败：参数错误' );
		
		$paramarr = array ('cid' => $cid, 'pvs' => $pvs, 'datetime' => $datetime );
		if (! $fields)
			$fields = &$this->_getFields ( new PropValue () );
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.itempropvalues.get', $paramarr );
		$list = new ItemProp ();
		$this->__firefillProperty ( $list, $resultarr, ItemProp::$_DataLayerout ['varclass'] );
		$result = $list->prop_values;
		if (property_exists ( $list, 'last_modified' ))
			$last_modified = $list->last_modified;
		else
			$last_modified = NULL;
		return $result;
	}
	/**
	 * 查询B商家被授权品牌列表和类目列表，taobao method: taobao.itemcats.authorize.get
	 * @param SellerAuthorize $result   要填充授权对象，类型@see SellerAuthorize
	 * @param string $fields  需返回的字段列表。目前支持有：brand.vid, brand.name,
	 * item_cat.cid, item_cat.name, item_cat.status,item_cat.sort_order,
	 * item_cat.parent_cid,item_cat.is_parent <br/>如果为空，自动返回所有字段
	 * @return SellerAuthorize 已经填充授权对象
	 */
	function readItemcatsAuthorize(SellerAuthorize $result, $fields = NULL)
	{
		if (! $result)
			throw new TaoBaoRuntimeExecption ( - 1, 'readItemcatsAuthorize运行失败：参数错误' );
		
		$paramarr = array ();
		$paramarr ['fields'] = 'brand.vid, brand.name,item_cat.cid,item_cat.name,
		item_cat.status,item_cat.sort_order,item_cat.parent_cid,item_cat.is_parent';
		
		$resultarr = &$this->__fireRequest ( 'taobao.itemcats.authorize.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, SellerAuthorize::$_DataLayerout ['varclass'] );
	}
	/**
	 * 获取后台供卖家发布商品的标准商品类目，taobao method: taobao.itemcats.get
	 * <br/>如何获得叶子类目的cid?调用taobao.itemcats.get获取类目ID,
	 * 或通过属性工具(http: //open.taobao.com/api_tool/props/)获得。  
	 * @param array $result   要填充类目列表，类型@see ItemCat
	 * @param integer $parent_cid   父商品类目 id，0表示根节点, 传输该参数返回所有子类目。
	 * (cids、parent_cid至少传一个) 
	 * @param string $cids    商品所属类目ID列表，用半角逗号(,)分隔
	 * 例如:(18957,19562,) (cids、parent_cid至少传一个)
	 * @param string  $datetime 时间戳。格式:yyyy-MM-dd HH:mm:ss
	 * 如果没有传，则取所有的类目信息(如果传了parent_cid或者cids，则忽略datetime),
	 * 目前只支持1970-01-01 00:00:00这个值传入
	 * @param string  $last_modified 接口返回结果中的最近修改时间。格式:yyyy-MM-dd HH:mm:ss 
	 * @param string $fields  需要返回的字段列表，见ItemCat，默认返回：cid,parent_cid,name,is_parent 
	 * <br/>如果为空，自动返回所有字段
	 * @return array 已经填充类目列表，类型@see ItemCat
	 */
	function &readItemcats(array &$result, $parent_cid, $cids, $datetime = '1970-01-01 00:00:00', &$last_modified = NULL, $fields = NULL)
	{
		if (! isset ( $result ) || (! $cids && ! isset ( $parent_cid )))
			throw new TaoBaoRuntimeExecption ( - 1, 'readItemcats运行失败：参数错误' );
		
		$paramarr = array ('parent_cid' => $parent_cid, 'cids' => $cids, 'datetime' => $datetime );
		if (! $fields)
			$fields = &$this->_getFields ( new ItemCat () );
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.itemcats.get', $paramarr );
		$list = new SellerAuthorize ();
		$this->__firefillProperty ( $list, $resultarr, SellerAuthorize::$_DataLayerout ['varclass'] );
		$result = $list->item_cats;
		if (property_exists ( $list, 'last_modified' ))
			$last_modified = $list->last_modified;
		else
			$last_modified = NULL;
		return $result;
	}
	/**
	 * 获取标准商品类目属性，taobao method: taobao.itemprops.get
	 * @param array $result   要填充类目属性信息列表，类型@see ItemProp，
	 * 如果是取全量或者增量，不包括属性值，根据fields传入的参数返回相应的结果
	 * @param ItemPropParam $param 获取标准商品类目属性参数    
	 * @param string  $last_modified 接口返回结果中的最近修改时间
	 * 《(只有取全量或增量的时候会返回该字段)。格式:yyyy-MM-dd HH:mm:ss     
	 * @param string $fields  需返回的字段列表。可选值：PropValue结构体中的所有字段；
	 * 字段之间用“,”分隔。 <br/>如果为空，自动返回所有字段
	 * @return array 已经填充属性值列表，类型@see PropValue
	 */
	function &readItemProps(array &$result, ItemPropParam $param, &$last_modified = NULL, $fields = NULL)
	{
		if (! $param || ! $param->cid)
			throw new TaoBaoRuntimeExecption ( - 1, 'readItemProps运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		if (! $fields)
		{
			$fields = &$this->_getFields ( new ItemProp () );
		}
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.itemprops.get', $paramarr );
		$list = new _ItemPropList ();
		$this->__firefillProperty ( $list, $resultarr, _ItemPropList::$_DataLayerout ['varclass'] );
		$result = $list->item_props;
		$last_modified = $list->last_modified;
		return $result;
	}
	/**
	 * 搜索评价信息，taobao method: taobao.traderates.get
	 * @param TaobaoTradeRatesGetResult $result   要填充搜索评价列表
	 * @param TaobaoTradeRatesGetParam $param     搜索评价参数
	 * @param string $fields  需返回的字段列表。可选值：TradeRate结构体中的所有字段；
	 * 字段之间用","分隔。 <br/>如果为空，自动返回所有字段
	 * @return TaobaoTradeRatesGetResult 已经填充搜索评价列表
	 */
	function readTraderates(TaobaoTradeRatesGetResult $result, TaobaoTradeRatesGetParam $param, $fields = NULL)
	{
		if (! $param || ! $param->rate_type || ! $param->role)
			throw new TaoBaoRuntimeExecption ( - 1, 'readTraderates运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		if (! $fields)
			$fields = &$this->_getFields ( new TaobaoTradeRate () );
		$paramarr ['fields'] = $fields;
		$resultarr = &$this->__fireRequest ( 'taobao.traderates.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaoTradeRatesGetResult::$_DataLayerout ['varclass'] );
	}
	/**
	 * 新增单个评价，taobao method: taobao.traderate.add 
	 * @param TaobaoTradeRateAddParam $param  新增评价参数.
	 * @return TaobaoTradeRate                返回参数， 包括tid、oid、created
	 */
	function writeTraderateAdd(TaobaoTradeRateAddParam $param)
	{
		if (! $param || ! $param->tid || ! $param->result || ! $param->role)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeTraderateAdd运行失败：参数错误' );
		$paramarr = get_object_vars ( $param );
		$resultarr = &$this->__fireRequest ( 'taobao.traderate.add', $paramarr );
		$result = new TaobaoTradeRate ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 针对父子订单新增新增批量评价，taobao method: taobao.traderate.list.add 
	 * @param TaobaoTradeRateListAddParam $param  新增评价参数.
	 * @return TaobaoTradeRate                返回参数， 包括tid、created
	 */
	function writeTraderateListAdd(TaobaoTradeRateListAddParam $param)
	{
		if (! $param || ! $param->tid || ! $param->result || ! $param->role)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeTraderateListAdd运行失败：参数错误' );
		$paramarr = get_object_vars ( $param );
		$resultarr = &$this->__fireRequest ( 'taobao.traderate.list.add', $paramarr );
		$result = new TaobaoTradeRate ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 获取图片分类信息 ，taobao method: taobao.picture.category.get
	 * @param array $result   要填充图片分类信息列表，类型@see TaobaoPictureCategory
	 * @param integer $picture_category_id 图片分类ID
	 * @param string $picture_category_name 图片分类名，不支持模糊查询
	 * @param string $type 分类类型,
	 * fixed代表店铺装修分类类别，auction代表宝贝分类类别，user-define代表用户自定义分类类别
	 * @param string $fields 查询字段。如果为空，自动传入TaobaoPictureCategory的所有字段
	 * @return array 已经填充的图片分类信息列表，返回的包含的具体信息为入参fields请求的字段信息，类型@see TaobaoPictureCategory
	 */
	function &readPictureCategory(array &$result, $picture_category_id = NULL, $picture_category_name = NULL, $type = NULL, $fields = NULL)
	{
		if (! isset ( $result ))
			throw new TaoBaoRuntimeExecption ( - 1, 'readPictureCategory运行失败：参数错误' );
		
		$paramarr = array ('picture_category_id' => $picture_category_id, 'picture_category_name' => $picture_category_name, 'type' => $type );
		if (! $fields)
			$fields = &$this->_getFields ( new TaobaoPictureCategory () );
		$paramarr ['fields'] = $fields;
		$resultarr = &$this->__fireRequest ( 'taobao.picture.category.get', $paramarr );
		$list = new _TaobaoPictureCategoryList (); //* taobao doc error
		$this->__firefillProperty ( $list, $resultarr, _TaobaoPictureCategoryList::$_DataLayerout ['varclass'] );
		$result = $list->picture_categories;
		return $result;
	}
	/**
	 * 获取图片信息，taobao method: taobao.picture.get 
	 * @param TaobaoPictureResult $result   要填充图片信息列表
	 * @param TaobaoPictureParam $param     获取图片信息参数
	 * @param string $fields  需返回的字段列表。可选值：TaobaoPicture结构体中的所有字段；
	 * 字段之间用","分隔。 <br/>如果为空，自动返回所有字段
	 * @return TaobaoPictureResult 已经填充图片信息列表
	 */
	function readPicture(TaobaoPictureResult $result, TaobaoPictureParam $param, $fields = NULL)
	{
		if (! $param || ! isset ( $result ))
			throw new TaoBaoRuntimeExecption ( - 1, 'readPicture运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		if (! $fields)
			$fields = &$this->_getFields ( new TaobaoPicture () );
		$paramarr ['fields'] = $fields;
		$resultarr = &$this->__fireRequest ( 'taobao.picture.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaoPictureResult::$_DataLayerout ['varclass'] );
	}
	/**
	 * 获取前台展示的店铺内卖家自定义商品类目 ，taobao method: taobao.sellercats.list.get
	 * @param array $result   要填充店铺内卖家自定义商品类目，类型@see TaobaoSellerCat
	 * @param string $nick    卖家昵称
	 * @return array 已经填充的店铺内卖家自定义商品类目，类型@see TaobaoSellerCat
	 */
	function &readSellercatsList(array &$result, $nick)
	{
		if (! isset ( $result ) || ! $nick)
			throw new TaoBaoRuntimeExecption ( - 1, 'readShopcatsList运行失败：参数错误' );
		
		$paramarr = array ('nick' => $nick );
		$resultarr = &$this->__fireRequest ( 'taobao.sellercats.list.get', $paramarr );
		$list = new _TaobaoSellerCatList ();
		$this->__firefillProperty ( $list, $resultarr, _TaobaoSellerCatList::$_DataLayerout ['varclass'] );
		$result = $list->seller_cats;
		return $result;
	}
	/**
	 * 获取卖家店铺的基本信息 ，taobao method: taobao.shop.get
	 * @param TaobaoShop $result  要填充卖家店铺信息，类型@see TaobaoShop
	 * @param string $nick   卖家昵称
	 * @param string $fields 查询字段。如果为空，自动传入TaobaoShop的所有字段
	 * @return TaobaoShop 已经填充的卖家店铺信息，返回的包含的具体信息为入参fields请求的字段信息，类型@see TaobaoShop
	 */
	function readShop(TaobaoShop $result, $nick, $fields = NULL)
	{
		if (! isset ( $result ) || ! $nick)
			throw new TaoBaoRuntimeExecption ( - 1, 'readShop运行失败：参数错误' );
		
		$paramarr = array ('nick' => $nick );
		if (! $fields)
			$fields = &$this->_getFields ( $result );
		$paramarr ['fields'] = $fields;
		$resultarr = &$this->__fireRequest ( 'taobao.shop.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaoShop::$_DataLayerout ['varclass'] );
	}
	/**
	 * 获取卖家店铺剩余橱窗数量 ，taobao method: taobao.shop.remainshowcase.get
	 * <br/>B商家不能返回剩余橱窗数量
	 * @param TaobaoShop $result  要填充卖家剩余橱窗数量
	 * @return TaobaoShop 只支持返回剩余橱窗数量
	 */
	function readShopRemainshowcase(TaobaoShop $result)
	{
		if (! isset ( $result ))
			throw new TaoBaoRuntimeExecption ( - 1, 'readShopRemainshowcase运行失败：参数错误' );
		$paramarr = array ();
		$resultarr = &$this->__fireRequest ( 'taobao.shop.remainshowcase.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaoShop::$_DataLayerout ['varclass'] );
	}
	/**
	 * 获取前台展示的店铺类目 ，taobao method: taobao.shopcats.list.get
	 * @param array $result   要填充物流公司信息，类型@see TaobaoShopCat
	 * @param string $fields 查询字段。如果为空，自动传入TaobaoShopCat的所有字段
	 * @return array 已经填充的物流公司信息，返回的包含的具体信息为入参fields请求的字段信息，类型@see TaobaoShopCat
	 */
	function &readShopcatsList(array &$result, $fields = NULL)
	{
		if (! isset ( $result ))
			throw new TaoBaoRuntimeExecption ( - 1, 'readShopcatsList运行失败：参数错误' );
		
		$paramarr = array ();
		if (! $fields)
			$fields = &$this->_getFields ( new TaobaoShopCat () );
		$paramarr ['fields'] = $fields;
		$resultarr = &$this->__fireRequest ( 'taobao.shopcats.list.get', $paramarr );
		$list = new _TaobaoShopCatList ();
		$this->__firefillProperty ( $list, $resultarr, _TaobaoShopCatList::$_DataLayerout ['varclass'] );
		$result = $list->shop_cats;
		return $result;
	}
	/**
	 * 上传单张图片，taobao method: taobao.picture.upload
	 * @param string $picture_category_id 图片分类ID，具体某个分类ID或0上传到未分类下，只能一个分类
	 * @param string $image_input_title 包括后缀名的图片标题,不能为空，
	 * 如Bule.jpg,有些卖家希望图片上传后取图片文件的默认名
	 * @param string $image  图片二进制文件名称,必须存在,允许png、jpg、gif图片格式
	 * @param string $title  图片标题,如果为空,传的图片标题就取去掉后缀名的image_input_title,
	 * 超过50字符长度会截取50字符,重名会在标题末尾加"(1)";标题末尾已经有"(数字)"了，则数字加1
	 * @return TaobaoPicture 当前上传的一张图片信息
	 */
	function writePictureUpload($picture_category_id, $image_input_title, $image, $title = NULL)
	{
		if (! $picture_category_id || ! $image_input_title || ! $image)
			throw new TaoBaoRuntimeExecption ( - 1, 'writePictureUpload运行失败：参数错误' );
		if (! file_exists ( $image ))
			throw new TaoBaoRuntimeExecption ( - 1, 'writePictureUpload运行失败：找不到图像文件  ' . $image );
		$paramarr = array ('picture_category_id' => $picture_category_id, 'image_input_title' => $image_input_title, 'title' => $title );
		$request = clone $this->request;
		$request->httpmethod = TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
		$request->postWithFiles ['img'] = $image;
		$resultarr = &$this->__fireRequest ( 'taobao.picture.upload', $paramarr, false, $request );
		$request = NULL;
		$result = new TaobaoPicture ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 删除图片空间图片，taobao method: taobao.picture.delete
	 * @param string $picture_ids        图片ID字符串,可以一个也可以一组,用英文逗号间隔,如450,120,155
	 * @return boolean 是否删除
	 */
	function writePictureDelete($picture_ids)
	{
		if (! $picture_ids)
			throw new TaoBaoRuntimeExecption ( - 1, 'writePictureDelete运行失败：参数错误' );
		
		$paramarr = array ('picture_ids' => $picture_ids );
		$resultarr = &$this->__fireRequest ( 'taobao.picture.delete', $paramarr ); //*taobao none test sandbox
		$result = new stdClass ();
		$this->__firefillProperty ( $result, $resultarr );
		return $result->success;
	}
	/**
	 * 更新卖家自定义类目，taobao method: taobao.sellercats.list.update 
	 * @param TaobaoSellerCatAddParam $param  添加卖家自定义类目参数
	 * @return TaobaoSellerCat       返回参数， 包括cid,created
	 */
	function writeSellercatsListUpdate(TaobaoSellerCatUpdateParam $param)
	{
		if (! $param || ! $param->name)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeSellercatsListUpdate运行失败：参数错误' );
		if ($param->pic_url)
			$param->pict_url = $param->pic_url; //taobao ?? pict_url<->pic_url		  
		$paramarr = get_object_vars ( $param );
		$resultarr = &$this->__fireRequest ( 'taobao.sellercats.list.update', $paramarr );
		$result = new TaobaoSellerCat ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 添加卖家自定义类目，taobao method: taobao.sellercats.list.add 
	 * @param TaobaoSellerCatAddParam $param  添加卖家自定义类目参数
	 * @return TaobaoSellerCat       返回参数， 包括cid,created
	 */
	function writeSellercatsListAdd(TaobaoSellerCatAddParam $param)
	{
		if (! $param || ! $param->name)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeSellercatsListAdd运行失败：参数错误' );
		if ($param->pic_url)
			$param->pict_url = $param->pic_url; //taobao ?? pict_url<->pic_url
		

		$paramarr = get_object_vars ( $param );
		$resultarr = &$this->__fireRequest ( 'taobao.sellercats.list.add', $paramarr );
		$result = new TaobaoSellerCat ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 更新店铺基本信息，taobao method: taobao.shop.update 
	 * <br/>更新店铺基本信息，目前只支持标题、分告和描述，title, bulletin和desc至少必须传一个
	 * @param string $title  店铺标题。不超过30个字符；过滤敏感词，如淘咖啡、阿里巴巴等。
	 * @param string $bulletin  店铺公告。不超过1024个字符
	 * @param string $desc      店铺描述。10～2000个字符以内
	 * @return TaobaoShop       返回参数， 包括sid、modified
	 */
	function writeShopUpdate($title, $bulletin, $desc)
	{
		if (! $title && ! $bulletin && ! $desc)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeShopUpdate运行失败：参数错误' );
		$paramarr = array ('title' => $title, 'bulletin' => $bulletin, 'desc' => $desc );
		$resultarr = &$this->__fireRequest ( 'taobao.shop.update', $paramarr );
		$result = new TaobaoShop ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 获取交易和评价变更通知信息 ，taobao method: taobao.increment.trades.get
	 * @param TaobaoIncrementNotifyTradeResult $result  要填充交易和评价变更通知信息
	 * @param TaobaoIncrementTradesParam $param   接口参数
	 * @return TaobaoIncrementNotifyTradeResult 已经填充的交易和评价变更通知信息
	 */
	function readIncrementTrades(TaobaoIncrementNotifyTradeResult $result, TaobaoIncrementTradesParam $param, $fields = NULL)
	{
		if (! $result || ! $param)
			throw new TaoBaoRuntimeExecption ( - 1, 'readIncrementTrades运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		$resultarr = &$this->__fireRequest ( 'taobao.increment.trades.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaoIncrementNotifyTradeResult::$_DataLayerout ['varclass'] );
	}
	/**
	 * 获取退款变更通知信息 ，taobao method: taobao.increment.refunds.get
	 * @param TaobaoIncrementNotifyRefundResult $result  要填充退款变更通知信息
	 * @param TaobaoIncrementRefundsParam $param   接口参数
	 * @return TaobaoIncrementNotifyRefundResult 已经填充的退款变更通知信息
	 */
	function readIncrementRefunds(TaobaoIncrementNotifyRefundResult $result, TaobaoIncrementRefundsParam $param, $fields = NULL)
	{
		if (! $result || ! $param)
			throw new TaoBaoRuntimeExecption ( - 1, 'readIncrementRefunds运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		$resultarr = &$this->__fireRequest ( 'taobao.increment.refunds.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaoIncrementNotifyRefundResult::$_DataLayerout ['varclass'] );
	}
	/**
	 * 获取商品变更通知信息 ，taobao method: taobao.increment.items.get
	 * @param TaobaoIncrementNotifyItemResult $result  要填充商品变更通知信息
	 * @param TaobaoIncrementItemsParam $param   接口参数
	 * @return TaobaoIncrementNotifyItemResult 已经填充的商品变更通知信息
	 */
	function readIncrementItems(TaobaoIncrementNotifyItemResult $result, TaobaoIncrementItemsParam $param, $fields = NULL)
	{
		if (! $result || ! $param)
			throw new TaoBaoRuntimeExecption ( - 1, 'readIncrementItems运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		$resultarr = &$this->__fireRequest ( 'taobao.increment.items.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaoIncrementNotifyItemResult::$_DataLayerout ['varclass'] );
	}
	/**
	 * ISV订阅信息查询 ，taobao method: taobao.increment.subscribemessage.get
	 * @param TaobaoSubscribeMessage $result  要填充ISV订阅信息查询
	 * @param string $fields 查询字段。如果为空，自动传入TaobaoSubscribeMessage的所有字段
	 * @return TaobaoSubscribeMessage 已经填充的ISV订阅信息查询
	 */
	function readIncrementSubscribemessage(TaobaoSubscribeMessage $result, $fields = NULL)
	{
		if (! $result)
			throw new TaoBaoRuntimeExecption ( - 1, 'readIncrementSubscribemessage运行失败：参数错误' );
		$paramarr = array ();
		if (! $fields)
		{
			$fields = &$this->_getFields ( $result );
			$fields .= ',subscriptions.topic,subscriptions.status';
		}
		$paramarr ['fields'] = $fields;
		$resultarr = &$this->__fireRequest ( 'taobao.increment.subscribemessage.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaoSubscribeMessage::$_DataLayerout ['varclass'] );
	}
	/**
	 * 用户授权信息查询 ，taobao method: taobao.increment.authorizemessages.get
	 * @param TaobaoIncrementAuthorizemessagesResult $result  要填充用户授权信息查询
	 * @param TaobaoIncrementAuthorizemessagesParam $param   接口参数
	 * @param string $fields 查询字段。如果为空，自动传入TaobaoAuthorizeMessage的所有字段
	 * @return TaobaoIncrementAuthorizemessagesResult 已经填充的用户授权信息查询
	 */
	function readIncrementAuthorizemessages(TaobaoIncrementAuthorizemessagesResult $result, TaobaoIncrementAuthorizemessagesParam $param, $fields = NULL)
	{
		if (! $result)
			throw new TaoBaoRuntimeExecption ( - 1, 'readIncrementAuthorizemessages运行失败：参数错误' );
		$paramarr = get_object_vars ( $param );
		if (! $fields)
			$fields = &$this->_getFields ( new TaobaoAuthorizeMessage () );
		$paramarr ['fields'] = $fields;
		$resultarr = &$this->__fireRequest ( 'taobao.increment.authorizemessages.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaoIncrementAuthorizemessagesResult::$_DataLayerout ['varclass'] );
	}
	/**
	 * ISV订阅增量消息，taobao method: taobao.increment.app.subscribe 
	 * @param string $topics    要订阅的消息类别。可多个类别同时订阅，每种类型之间以";"分隔。具体选值请见：增量消息类型说明。
	 * 例如，如果要同时订阅交易，退款，商品的消息传入的字符串就是"trade;refund;item"
	 * @param string $status    要订阅的消息状态。可选值有：商品消息状态、退款消息状态、交易消息状态里面的状态类型。
	 * status字段支持多个状态同时订阅。每个大类的状态（商品消息状态里的所有消息状态属于同一个大类，
	 * 退款消息状态里的所有消息状态属于同一个大类，交易消息状态里的所有消息状态属于同一个大类）要合并到一起传入。
	 * 每个大类的消息内部用","连接，大类之间用";"连接。另，大类的排列顺序要和topics入参中类型的顺序一一对应，
	 * 如果不传具体某个大类的消息而传入all，表示订阅这个大类下所有的消息状态。如：传入了topics="trade;refund;item"时：当传入status="all; 
	 * all;all"表示我订阅者三种类型消息下的所有状态的消息；当传入status="TradeCreate,TradeSuccess;all; 
	 * ItemDelete"表示我订阅交易类型下的交易创建和交易成功的消息，退款类型下的所有退款相关消息，商品下的商品删除的消息。
	 * @param integer $duration ISV订阅服务时间，以月计算。目前可选值：1、3、6、12四种时间间隔。
	 * 如果ISV属于淘宝的合作伙伴或者是自用型，可以选择订阅时间为-1（表示永久订阅）
	 * <br/>自用型应用：执行taobao.increment.app.subscribe进行订阅，设置duration参数值为-1。自用型应用订阅后默认会自动进行一次授权，授权时间是永远有效。
	 * <br/>他用型应用：首先，执行taobao.increment.app.subscribe进行订阅，设置合理的duration参数（如果为淘宝合作伙伴应用可以设置为-1）； 然后执行taobao.increment.user.authorize进行用户授权。 
	 * <br/>授权后，应用即可通过taobao.increment.items.get、taobao.increment.trades.get或taobao.increment.refunds.get获取已授权用户的增量数据。 
	 * @return TaobaoSubscribeMessage   返回订阅增量消息
	 */
	function writeIncrementAppSubscribe($topics, $status, $duration = -1)
	{
		if (! $topics && ! $status && ! $duration)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeIncrementAppSubscribe运行失败：参数错误' );
		$paramarr = array ('topics' => $topics, 'status' => $status, 'duration' => $duration );
		$resultarr = &$this->__fireRequest ( 'taobao.increment.app.subscribe', $paramarr );
		$result = new TaobaoSubscribeMessage ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 用户授权ISV获取其增量消息，taobao method: taobao.increment.user.authorize 
	 * <br/>此接口用于用户授权ISV获取其增量消息。 用户授权后订阅的消息类型继承与ISV订阅的所有消息类型。 
	 * 如果用户已经授权该ISV获取自己的增量消息，重复授权会跟据传入的参数更新授权记录
	 * （如：用户的email信息、有效期限等等） 用户授权的到期时间必须小于等于ISV服务到期时间。 
	 * <br/>自用型应用不需要调用此接口，调用taobao.notify.app.subscribe的时候会默认进行授权。
	 * @param string $email    授权用户的邮件地址
	 * @param string $duration 用户授权的时间，以周计算。
	 * <br/>可选值为1和2，不传默认授权时间为1周。用户授权到期时间不能超过ISV服务到期时间。否则授权会报错。
	 * @return TaobaoAuthorizeMessage   返回用户授权ISV订阅增量消息
	 */
	function writeIncrementUserAuthorize($email, $duration = 1)
	{
		if (! $email && ! $duration)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeIncrementUserAuthorize运行失败：参数错误' );
		$paramarr = array ('email' => $email, 'duration' => $duration );
		$resultarr = &$this->__fireRequest ( 'taobao.increment.user.authorize', $paramarr );
		$result = new TaobaoAuthorizeMessage ();
		return $this->__firefillProperty ( $result, $resultarr );
	}
	/**
	 * 读取单个用户信息，taobao method: taobao.user.get
	 * <br/>传入淘宝会员帐号获取用户详细信息，用户登陆才能获取隐私信息，
	 * 但不包括:location.address,real_name,id_card,phone,mobile,email 
	 * <br/>$nick和$alipay_no必须传入一个，或者$user中有对应的值
	 * @param User $user 要填充的用户信息
	 * @param string $nick 用户昵称，如果昵称为中文，请使用UTF-8字符集对昵称进行URL编码
	 * @param string $alipay_no 支付宝账号，用支付宝账号查询用户对象只能查询公开信息。
	 * @param string $fields 查询字段。如果为空，自动传入User的所有字段
	 * <br/>可选值：User结构体中的所有字段；以半角逗号(,)分隔。* 不支持：location.address,real_name,id_card,phone,mobile,email
	 * @return User 返回已经填充的用户信息
	 */
	function readUser(ShopExUser $user, $uname = NULL, $member_id = NULL, $fields = NULL)
	{
		if (! $user || (! $user->uname && ! $uname && ! $member_id && ! $user->member_id))
			throw new ShopExRuntimeExecption ( - 1, 'readUser运行失败：参数错误' );
		
		if (! $user && $user->uname && ! $uname)
			$uname = $user->uname;
		if (! $user && $user->member_id && ! member_id)
			$member_id = $user->member_id;
		
		$paramarr['searchParam'] = json_encode(array ('uname' => $uname, 'member_id' => $member_id ));
		
		if (! $fields)
			$fields = &$this->_getFields ( new ShopExUser() );
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'user.getfullinfo', $paramarr );

		return $this->__firefillProperty ( $user, $resultarr, ShopExUser::$_DataLayerout ['varclass'] );
	}
	/**
	 * 读取多个用户信息，taobao method: taobao.users.get
	 * <br/>传入多个淘宝会员帐号返回多个用户公开信息，只能返回公开信息
	 * @param array $user 要填充的用户信息列表，类型：@see User
	 * @param string $nicks 用户昵称，多个以半角逗号(,)分隔，最多40个，如果为中文，请使用UTF-8字符集对昵称进行URL编码
	 * @param string $fields 查询字段。如果为空，自动传入User的所有字段
	 * <br/>可选值：User结构体中的所有字段；以半角逗号(,)分隔。 
	 * @return array 返回已经填充的多个用户信息
	 */
	function &readUsers(array &$users, $nicks, $fields = NULL)
	{
		if (! $nicks)
			throw new TaoBaoRuntimeExecption ( - 1, 'readUsers运行失败：参数错误' );
		
		$paramarr = array ('nicks' => $nicks );
		if (! $fields)
			$fields = &$this->_getFields ( new User () );
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.users.get', $paramarr );
		$userlist = new _UserList ();
		$this->__firefillProperty ( $userlist, $resultarr, _UserList::$_DataLayerout ['varclass'] );
		$users = $userlist->users;
		return $users;
	}
	
	
	function readUserslist(ShopExUserSearchResultList $result,ShopExUserSearchParam $param ,$fields = NULL)
	{
		
		if (! $param || ! $result)
			throw new ShopExRuntimeExecption ( - 1, 'readUserslist运行失败：参数错误' );
		
		
		$paramarr['searchParam'] =json_encode(get_object_vars ( $param ));
		if (! $fields)
			$fields = &$this->_getFields ( new ShopExUserSearchResultList());
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'user.getlist', $paramarr );
		
		return $this->__firefillProperty ( $result, $resultarr, ShopExUserSearchResultList::$_DataLayerout ['varclass'] );
		
	}
	/**
	 * 获取淘宝系统当前时间，taobao method: taobao.time.get
	 * @param $result 淘宝系统当前时间，格式:yyyy-MM-dd HH:mm:ss
	 * @return User 返回淘宝系统当前时间，格式:yyyy-MM-dd HH:mm:ss
	 */
	function &readTime(&$result = NULL)
	{
		$resultarr = &$this->__fireRequest ( 'taobao.time.get', array () );
		$list = new stdClass ();
		$this->__firefillProperty ( $list, $resultarr );
		$result = $list->time;
		return $result;
	}
	
	//********extend function******//
	

	/**
	 * B商家保证金查询，taobao method: taobao.guarantyfunds.get
	 * @param array $result   要填充B商家保证金列表，类型@see TaobaoGuarantyFund，
	 * @param string  $begin_date 查询保证金操作记录创建时间开始，格式为:yyyy-MM-dd
	 * @param string  $end_date   查询保证金操作记录创建时间结束，格式为:yyyy-MM-dd
	 * @return array 已经填充B商家保证金列表，类型@see TaobaoGuarantyFund
	 */
	function &readGuarantyFunds(array &$result, $begin_date, $end_date)
	{
		if (! isset ( $result ) || ! $begin_date || ! $end_date)
			throw new TaoBaoRuntimeExecption ( - 1, 'readGuarantyFunds运行失败：参数错误' );
		$paramarr = array ('begin_date' => $begin_date, 'end_date' => $end_date );
		$resultarr = &$this->__fireRequest ( 'taobao.guarantyfunds.get', $paramarr );
		$list = new _TaobaoGuarantyFundList ();
		$this->__firefillProperty ( $list, $resultarr, _TaobaoGuarantyFundList::$_DataLayerout ['varclass'] );
		$result = $list->guarantyFunds;
		return $result;
	}
	/**
	 * 查询套餐列表信息，taobao method: taobao.suites.get
	 * @param TaobaoSuitesResult $result   要填充套餐列表
	 * @param string  $service_code 用户订购服务的服务码(申请服务的时候会得到)
	 * @return TaobaoSuitesResult 已经填充套餐列表
	 */
	function readSuites(TaobaoSuitesResult $result, $service_code)
	{
		if (! $result || ! $service_code)
			throw new TaoBaoRuntimeExecption ( - 1, 'readSuites运行失败：参数错误' );
		$paramarr = array ('service_code' => $service_code );
		$resultarr = &$this->__fireRequest ( 'taobao.suites.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaoSuitesResult::$_DataLayerout ['varclass'] );
	}
	/**
	 * 获取聊天对象列表，查询时间段<=7天,只支持xml返回，taobao method: taobao.wangwang.eservice.chatpeers.get
	 * <br/>taobao charset设置为utf-8
	 * @param TaobaoChatPeerListResult $result   要填充聊天对象列表
	 * @param string  $chat_id   聊天用户ID，淘宝nick ，原为cntaobao+淘宝nick，现为淘宝nick
	 * @param string  $start_date 查询起始日期。如2010-02-01，与当前日期间隔小于3个月。
	 * @param string  $end_date 查询结束日期。如2010-03-24，与起始日期跨度不能超过7天  
	 * @return TaobaoChatPeerListResult 已经填充聊天对象列表
	 */
	function readWangwangEserviceChatpeers(TaobaoChatPeerListResult $result, $chat_id, $start_date, $end_date)
	{
		if (! $result || ! $chat_id || ! $start_date || ! $end_date)
			throw new TaoBaoRuntimeExecption ( - 1, 'readWangwangEserviceChatpeers运行失败：参数错误' );
		$paramarr = array ('chat_id' => 'cntaobao' . $chat_id, 'start_date' => $start_date, 'end_date' => $end_date );
		$newreqest = clone $this->request;
		$newreqest->app_setting ['format'] = 'xml';
		$resultarr = &$this->__fireRequest ( 'taobao.wangwang.eservice.chatpeers.get', $paramarr, true, $newreqest );
		
		$this->__firefillProperty ( $result, $resultarr, TaobaoChatPeerListResult::$_DataLayerout ['varclass'] );
		foreach ( $result->chatpeers as $val )
			$val->uid = str_replace ( 'cntaobao', '', $val->uid );
		return $result;
	}
	/**
	 * 获取具体的聊天记录，taobao method: taobao.wangwang.eservice.chatlog.get
	 * <br/>taobao charset设置为utf-8
	 * @param TaobaoMsgListResult $result   要填充聊天记录列表
	 * @param string  $chat_id   聊天消息被查询用户，淘宝nick ，原为cntaobao+淘宝nick，现为淘宝nick
	 * @param string  $chat_id   聊天消息相关方，淘宝nick ，原为cntaobao+淘宝nick，现为淘宝nick
	 * @param string  $start_date 聊天消息起始时间，如2010-02-01
	 * @param string  $end_date   聊天消息终止时间，如2010-03-24
	 * @return TaobaoMsgListResult 已经填充聊天记录列表
	 */
	function readWangwangEserviceChatlog(TaobaoMsgListResult $result, $from_id, $to_id, $start_date, $end_date)
	{
		if (! $result || ! $from_id || ! $to_id || ! $start_date || ! $end_date)
			throw new TaoBaoRuntimeExecption ( - 1, 'readWangwangEserviceChatlog运行失败：参数错误' );
		$paramarr = array ('from_id' => 'cntaobao' . $from_id, 'to_id' => 'cntaobao' . $to_id, 'start_date' => $start_date, 'end_date' => $end_date );
		$newreqest = clone $this->request;
		$newreqest->app_setting ['format'] = 'xml';
		$resultarr = &$this->__fireRequest ( 'taobao.wangwang.eservice.chatlog.get', $paramarr, true, $newreqest );
		
		return $this->__firefillProperty ( $result, $resultarr, TaobaoMsgListResult::$_DataLayerout ['varclass'] );
	}
	/**
	 * 淘宝客实时报表查询，taobao method: taobao.taobaoke.interval.report.get
	 * @param TaobaokeReport $result   要填充淘宝客报表，类型@see TaobaokeReport，
	 * @param string  $start_date 查询起始时间，格式为yyyy-MM-dd HH:mm:ss 
	 * @param string  $end_date   查询结束时间，格式为yyyy-MM-dd HH:mm:ss.
	 * @return TaobaokeReport 已经填充淘宝客报表，类型@see TaobaokeReport
	 */
	function readTaobaokeIntervalReport(TaobaokeReport $result, $start_date, $end_date)
	{
		if (! $result || ! $start_date || ! $end_date)
			throw new TaoBaoRuntimeExecption ( - 1, 'readTaobaokeIntervalReport运行失败：参数错误' );
		$paramarr = array ('start_date' => $start_date, 'end_date' => $end_date );
		$resultarr = &$this->__fireRequest ( 'taobao.taobaoke.interval.report.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaokeReport::$_DataLayerout ['varclass'] );
	}
	/**
	 * 淘宝客报表查询，taobao method: taobao.taobaoke.report.get
	 * @param TaobaokeReport $result   要填充淘宝客报表，类型@see TaobaokeReport，
	 * @param string  $date 需要查询报表的日期，有效的日期为最近3个月内的某一天，格式为:yyyyMMdd,如20090520.  
	 * @param string $fields  需返回的字段列表。可选值：PropValue结构体中的所有字段；
	 * @return TaobaokeReport 已经填充淘宝客报表，类型@see TaobaokeReport
	 */
	function readTaobaokeReport(TaobaokeReport $result, $date, $fields = NULL)
	{
		if (! $result || ! $date)
			throw new TaoBaoRuntimeExecption ( - 1, 'readTaobaokeReport运行失败：参数错误' );
		$paramarr = array ('date' => $date );
		if (! $fields)
			$fields = &$this->_getFields ( new TaobaokeReportMember () );
		$paramarr ['fields'] = $fields;
		$resultarr = &$this->__fireRequest ( 'taobao.taobaoke.report.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, TaobaokeReport::$_DataLayerout ['varclass'] );
	}
	
	//**注意：分销API，淘宝试用版
	

	/**
	 * 采购单发货，taobao method: taobao.fenxiao.delivery.send
	 * @param integer $order_id   采购单编号，必须
	 * @param string $out_sid   运单号，必须
	 * @param string $company_code   物流公司代码，必须
	 * <br/>可选值：EMS(EMS)、STO(申通E物流)、YTO(圆通速递)、ZTO(中通速递)、
	 * ZJS(宅急送)、YUNDA(韵达快运)、 TTKDEX(天天快递)、FEDEX(联邦快递)、
	 * DBL(德邦物流)、HTKY(汇通快运)、HQ(华强物流)、SF(顺丰速运)、
	 * POST(邮政平邮)、OTHER(其他)，<br/>默认为OTHER。
	 * @param string $company_name   物流公司名称，
	 * <br/>公司代码为OTHER时必须填写公司名称，公司代码为其它时该字段忽略，
	 * 取系统中定义的公司代码对应的公司名称。
	 * @return string 更新时间，时间格式：yyyy-MM-dd HH:mm:ss
	 */
	function writeFenxiaoDeliverySend($order_id, $out_sid, $company_name, $company_code = 'OTHER')
	{
		if (! $order_id || ! $company_code || ! $out_sid)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeFenxiaoDeliverySend运行失败：参数错误' );
		if ($company_code == 'OTHER' && ! $company_name)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeFenxiaoDeliverySend运行失败：必须传入物流公司名称' );
		
		$paramarr = array ('order_id' => $order_id, 'company_code' => $company_code, 'out_sid' => $out_sid );
		if ($company_name)
			$paramarr ['company_name'] = $company_name;
		$resultarr = &$this->__fireRequest ( 'taobao.fenxiao.delivery.send', $paramarr );
		$list = new stdClass ();
		$this->__firefillProperty ( $list, $resultarr );
		if (! property_exists ( $list, 'order_id' ) || $list->order_id != $order_id)
			throw new TaoBaoRuntimeExecption ( - 2, 'writeFenxiaoDeliverySend运行失败：淘宝系统错误' );
		if (property_exists ( $list, 'modified' ))
			return $list->modified;
	}
	/**   
	 * 查询采购单信息，taobao method: taobao.fenxiao.orders.get
	 * @param FenxiaoPurchaseOrderList $result   要填充淘宝分销采购单列表
	 * @param FenxiaoPurchaseOrderParam $param 查询分销采购单参数 
	 * @return array 已经填充淘宝采购单列表
	 */
	function readFenxiaoOrders(FenxiaoPurchaseOrderList $result, FenxiaoPurchaseOrderParam $param)
	{
		if (! $param || ! $param->status) //||! $param->start_created || !$param->end_created
			throw new TaoBaoRuntimeExecption ( - 1, 'readFenxiaoOrders运行失败：参数错误' );
		$paramarr = get_object_vars ( $param );
		$resultarr = &$this->__fireRequest ( 'taobao.fenxiao.orders.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, FenxiaoPurchaseOrderList::$_DataLayerout ['varclass'] );
	}
	/**   
	 * 查询分销产品列表，taobao method: taobao.fenxiao.products.get
	 * @param FenxiaoProductList $result   要填充淘宝分销产品列表
	 * @param FenxiaoProductParam $param 查询分销产品列表参数 
	 * @param string $fields  指定查询额外的信息，可选值：skus（sku数据）、images（多图），
	 * 多个可选值用逗号分割。  <br/>如果为空，设置为skus,images
	 * @return FenxiaoProductList 已经填充淘宝分销产品列表
	 */
	function readFenxiaoProducts(FenxiaoProductList $result, FenxiaoProductParam $param, $fields = NULL)
	{
		if (! $param)
			throw new TaoBaoRuntimeExecption ( - 1, 'readFenxiaoProducts运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		if (! $fields)
			$fields = 'skus,images';
		$paramarr ['fields'] = $fields;
		
		$resultarr = &$this->__fireRequest ( 'taobao.fenxiao.products.get', $paramarr );
		return $this->__firefillProperty ( $result, $resultarr, FenxiaoProductList::$_DataLayerout ['varclass'] );
	}
	/**   
	 * 添加分销产品，taobao method: taobao.fenxiao.product.add
	 * @param FenxiaoProductAddParam $param 添加分销产品参数 
	 * <br/>必须参数项：name,productcat_id,standard_price,cost_price,retail_price_low
	 * retail_price_high,category_id,quantity,alarm_number,desc,prov,city,
	 * postage_type,have_invoice,have_guarantee
	 * @return array 已经添加分销产品，
	 * 包括pid：产品ID；created：产品创建时间，格式：yyyy-MM-dd HH:mm:ss
	 */
	function writeFenxiaoProductAdd(FenxiaoProductAddParam $param)
	{
		if (! $param)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeFenxiaoProductAdd运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		$resultarr = &$this->__fireRequest ( 'taobao.fenxiao.product.add', $paramarr, false );
		$list = new stdClass ();
		$this->__firefillProperty ( $list, $resultarr );
		if (! property_exists ( $list, 'pid' ) || ! property_exists ( $list, 'created' ))
			throw new TaoBaoRuntimeExecption ( - 2, 'writeFenxiaoProductAdd运行失败：淘宝系统错误' );
		return get_object_vars ( $list );
	}
	/**   
	 * 更新分销产品，taobao method: taobao.fenxiao.product.update
	 * @param FenxiaoProductAddParam $param 更新分销产品参数 
	 * <br/>必须参数项：pid
	 * @return array 已经更新分销产品，
	 * 包括pid：产品ID；modified：产品更新时间，格式：yyyy-MM-dd HH:mm:ss
	 */
	function writeFenxiaoProductUpdate(FenxiaoProductUpdateParam $param)
	{
		if (! $param)
			throw new TaoBaoRuntimeExecption ( - 1, 'writeFenxiaoProductUpdate运行失败：参数错误' );
		
		$paramarr = get_object_vars ( $param );
		$resultarr = &$this->__fireRequest ( 'taobao.fenxiao.product.update', $paramarr, false );
		$list = new stdClass ();
		$this->__firefillProperty ( $list, $resultarr );
		if (! property_exists ( $list, 'pid' ) || ! property_exists ( $list, 'modified' ))
			throw new TaoBaoRuntimeExecption ( - 2, 'writeFenxiaoProductUpdate运行失败：淘宝系统错误' );
		return get_object_vars ( $list );
	}
	/**   
	 * 查询产品线列表，taobao method: taobao.fenxiao.productcats.get
	 * @param array $result   要填充淘宝分销产品线列表，类型@see ProductCat
	 * @return array 已经填充淘宝分销产品线列表，类型@see ProductCat
	 */
	function &readFenxiaoProductCats(array &$result)
	{
		$paramarr = array ();
		$resultarr = &$this->__fireRequest ( 'taobao.fenxiao.productcats.get', $paramarr );
		$list = new _ProductCatList ();
		$this->__firefillProperty ( $list, $resultarr, _ProductCatList::$_DataLayerout ['varclass'] );
		$result = $list->productcats;
		return $result;
	}
	/**
	 * 获取淘宝用户信息，taobao method: taobao.fenxiao.tbuser.get
	 * @param array $result   要填充淘宝用户信息列表，类型@see TbUser
	 * @param integer $user_id 获取标准商品类目属性参数    
	 * @return array 已经填充淘宝用户信息列表，类型@see TbUser
	 */
	function &readFenxiaoTbUser(array &$result, $user_id)
	{
		if (! $user_id)
			throw new TaoBaoRuntimeExecption ( - 1, 'readFenxiaoTbUser运行失败：参数错误' );
		
		$paramarr = array ('user_id' => $user_id );
		$resultarr = &$this->__fireRequest ( 'taobao.fenxiao.tbuser.get', $paramarr );
		$list = new _TbUserList ();
		$this->__firefillProperty ( $list, $resultarr, _TbUserList::$_DataLayerout ['varclass'] );
		$result = $list->tbusers;
		if (count ( $result ) == 0)
		{ //for bug ,not array
			$list = new TbUser ();
			$this->__firefillProperty ( $list, $resultarr );
			$result [] = $list;
		}
		return $result;
	}
	
	//----private function ------//
	private function &_getFields($obj)
	{
		$result = '';
		foreach ( get_object_vars ( $obj ) as $key => $val )
		{
			if ($result)
				$result .= ',';
			$result .= $key;
		}
		return $result;
	}
	
	private function __setSimpleProperty(ReflectionClass $refclass, $obj, $varname, $varvalue)
	{
		if ($refclass->hasProperty ( $varname ))
		{
			$prop = $refclass->getProperty ( $varname );
			$prop->setValue ( $obj, $varvalue );
		}
	}
	private function __fillProperty($refclass,$obj,array &$arr,$complexClass=NULL){
		foreach ( $arr as $key => $val ) {
			if(! $key) continue;
			if ($refclass->hasProperty ( $key )===true) {
				$prop = $refclass->getProperty ( $key );
				if(! is_array($val)){ //simple property
                    if($prop->isPrivate() || $prop->isProtected()){
                       $prop->setAccessible(true);
                    }
					$prop->setValue ( $obj, $val );
				}
				elseif(count($val)>0){
				   $propvalue=$prop->getValue($obj);
				   if(is_array($propvalue)){
				   	  $classname=$complexClass[$key];
				   	  if(! $classname)
				   	     $prop->setValue($obj,$val);   //simple set array
				   	   else{
				   	   	  $comprefclass = new ReflectionClass($classname);
				   	   	  $valarr=array();
				   	   	  foreach($val as $valitem){
				   	   	    $compobj=$comprefclass->newInstance();
				   	   	    $this->__fillProperty($comprefclass,$compobj,$valitem,$complexClass);
				   	   	    $this->__setSimpleProperty($comprefclass,$compobj,'__owner',$obj);
				   	   	    $valarr[]=$compobj;
				   	   	  }
				   	   	  $prop->setValue($obj,$valarr); //set obj array
				   	   }
				   }else{
				   	  $classname=$complexClass[$key];
				   	  if($classname || ($propvalue && is_object($propvalue))){
				   	  	$compobj=NULL;
				   	  	if($propvalue){
				   	  	  $classname=get_class($propvalue);
				   	  	  $compobj=$propvalue;
				   	  	}
				   	    $comprefclass = new ReflectionClass($classname);
				   	    if(! $compobj) $compobj=$comprefclass->newInstance();
			            $this->__fillProperty($comprefclass,$compobj,$val,$complexClass);
			            $this->__setSimpleProperty($comprefclass,$compobj,'__owner',$obj);
			            $prop->setValue($obj,$compobj); //set obj
				   	  }else{
				   	    if($prop->isPrivate() || $prop->isProtected()){
                           $prop->setAccessible(true);
                        }				   	  	
				   	  	$prop->setValue($obj,$val);   //simple set array
				   	  }
				   }
				}
			}else{  //not found this property,add property
				//if($key!='errorCode' && $key!='errorMessage')
				  $obj->$key=$val;
			}
		}
		return $obj;		
	} 
	private function __firefillProperty($obj,array &$arr,$complexClass=NULL){

		if(! $obj || !$arr || count($arr)==0) return $obj;
		$refclass = new ReflectionObject ($obj);
		//print_r($arr);exit;
		$this->__fillProperty($refclass,$obj,$arr,$complexClass);
		$this->__setSimpleProperty($refclass,$obj,'__runtime',$this);
		
		return $obj;
	}	
	private function &__fireRequest($cmdid, array $paramArr, $retry = true, TaoBaoRequest $tmprequset = NULL)
	{
		if ($tmprequset)
			$request = $tmprequset;
		else
			$request = $this->request;
		$tryCount = $this->maxTryCount;
		$errcode = 0;
		$errmsg = "";
		if ($retry)
		{ //仅可对可 重调用数据不变接口函数 使用
			do
			{
				try
				{
					$arr = &$request->getArray ( $cmdid, $paramArr );
					//	print_r($arr);exit;
					if (! $arr || ! $request->checkResult ( $arr, $errcode, $errmsg ))
						$tryCount --;
					else
					{
						$tryCount = - 1;
						break;
					}
				}
				catch ( Exception $e )
				{
					$tryCount --;
				}
				if ($tryCount < $this->maxTryCount)
				{
					$ms = rand ( $this->minTrySpanMicroseconds, $this->maxTrySpanMicroseconds );
					usleep ( $ms );
				}
			}
			while ( $tryCount > 1 && $tryCount < $this->maxTryCount );
		} //仅可对可 重调用数据不变接口函数 使用
		

		if ($tryCount != - 1 || ! $retry)
		{
			try
			{
				$arr = &$request->getArray ( $cmdid, $paramArr );
			}
			catch ( Exception $e )
			{
				throw new ShopExRuntimeExecption ( - 2, '系统运行失败:' . $e->getMessage () );
			}
		}
		if (! $arr)
			throw new ShopExRuntimeExecption ( - 2, '系统运行失败:接口没有返回值，或接口返回json格式错误解析失败' );
		
		if (! $request->checkResult ( $arr, $errcode, $errmsg ))
			throw new ShopExRuntimeExecption ( $errcode, $errmsg . ";\n{$cmdid}" );
		return $arr;
	}
}
